使用UAParser在C#MVC項目中如何判斷用戶是在用什麼設備進行訪問(手機,平板仍是普通的電腦)

 

如今咱們開發的不少web應用都要支持手機等移動設備。爲了讓手機用戶能有更加好的用戶體驗,咱們常常爲手機設備專門準備一套前端的頁面。這樣當用戶使用普通電腦來訪問的時候,咱們的應用就向用戶展現普通電腦的頁面。當用戶使用手機等移動設備來訪問咱們的系統的時候,咱們就向用戶展現手機設備的頁面。可是這時候另外一個問題出現了。如何判斷用戶在使用什麼設備訪問咱們的應用?是使用手機仍是普通電腦?html

 

網上能查到的不一樣的實現方式很多。我在這裏也介紹一個咱們最近在項目中採用的方法。前端

 

咱們使用的是UAParser。UAParser是一個開源的項目,主要的功能是實現對各類用戶useragent的解析。如今已經有不少種編程語言的實現。C#只是其中的一種。web

 

爲了方便你們理解,我在這裏把主要的步驟和代碼都寫出來。編程

 

1) 用vs2013新建一個mvc的項目。瀏覽器

2) 使用nuget下載UAParsermvc

 

3) 新建一個接口和實現它的類。編程語言

 

4) 代碼ide

IUserAgentthis

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace UserDeviceDetectWebApplication.Service
{
    public interface IUserAgent
    {
        string RawValue { get; set; }

        UserAgentInfo UserAgent { get; }
        DeviceInfo Device { get; }
        OSInfo OS { get; }

        bool IsBot { get; }
        bool IsMobileDevice { get; }
        bool IsTablet { get; }
        //bool IsPdfConverter { get; }
    }

    public sealed class DeviceInfo
    {
        public DeviceInfo(string family, bool isBot)
        {
            this.Family = family;
            this.IsBot = isBot;
        }
        public override string ToString()
        {
            return this.Family;
        }
        public string Family { get; private set; }
        public bool IsBot { get; private set; }
    }

    public sealed class OSInfo
    {
        public OSInfo(string family, string major, string minor, string patch, string patchMinor)
        {
            this.Family = family;
            this.Major = major;
            this.Minor = minor;
            this.Patch = patch;
            this.PatchMinor = patchMinor;
        }
        public override string ToString()
        {
            var str = VersionString.Format(Major, Minor, Patch, PatchMinor);
            return (this.Family + (!string.IsNullOrEmpty(str) ? (" " + str) : null));
        }
        public string Family { get; private set; }
        public string Major { get; private set; }
        public string Minor { get; private set; }
        public string Patch { get; private set; }
        public string PatchMinor { get; private set; }

        private static string FormatVersionString(params string[] parts)
        {
            return string.Join(".", (from v in parts
                                     where !string.IsNullOrEmpty(v)
                                     select v).ToArray<string>());
        }
    }

    public sealed class UserAgentInfo
    {
        public UserAgentInfo(string family, string major, string minor, string patch)
        {
            this.Family = family;
            this.Major = major;
            this.Minor = minor;
            this.Patch = patch;
        }
        public override string ToString()
        {
            var str = VersionString.Format(Major, Minor, Patch);
            return (this.Family + (!string.IsNullOrEmpty(str) ? (" " + str) : null));
        }
        public string Family { get; private set; }
        public string Major { get; private set; }
        public string Minor { get; private set; }
        public string Patch { get; private set; }
    }

    internal static class VersionString
    {
        public static string Format(params string[] parts)
        {
            return string.Join(".", (from v in parts
                                     where !string.IsNullOrEmpty(v)
                                     select v).ToArray<string>());
        }
    }
}

 

UAParserUserAgentspa

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using uap = UAParser;
using System.Text.RegularExpressions;

namespace UserDeviceDetectWebApplication.Service
{
    public class UAParserUserAgent : IUserAgent
    {
        private readonly static uap.Parser s_uap;
        private static readonly Regex s_pdfConverterPattern = new Regex(@"wkhtmltopdf", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.CultureInvariant);

        # region Mobile UAs, OS & Devices

        private static readonly HashSet<string> s_MobileOS = new HashSet<string>
        {
            "Android", 
            "iOS", 
            "Windows Mobile", 
            "Windows Phone", 
            "Windows CE",
            "Symbian OS", 
            "BlackBerry OS", 
            "BlackBerry Tablet OS", 
            "Firefox OS", 
            "Brew MP", 
            "webOS",
            "Bada",
            "Kindle",
            "Maemo"
        };

        private static readonly HashSet<string> s_MobileBrowsers = new HashSet<string>
        {
            "Android", 
            "Firefox Mobile", 
            "Opera Mobile", 
            "Opera Mini", 
            "Mobile Safari",
            "Amazon Silk", 
            "webOS Browser", 
            "MicroB", 
            "Ovi Browser", 
            "NetFront", 
            "NetFront NX",
            "Chrome Mobile", 
            "Chrome Mobile iOS", 
            "UC Browser", 
            "Tizen Browser", 
            "Baidu Explorer", 
            "QQ Browser Mini",
            "QQ Browser Mobile", 
            "IE Mobile", 
            "Polaris", 
            "ONE Browser", 
            "iBrowser Mini", 
            "Nokia Services (WAP) Browser",
            "Nokia Browser", 
            "Nokia OSS Browser", 
            "BlackBerry WebKit", 
            "BlackBerry", "Palm", 
            "Palm Blazer",
            "Palm Pre", 
            "Teleca Browser", 
            "SEMC-Browser", 
            "PlayStation Portable", 
            "Nokia", 
            "Maemo Browser",
            "Obigo", 
            "Bolt", 
            "Iris", 
            "UP.Browser", 
            "Minimo", 
            "Bunjaloo",
            "Jasmine", 
            "Dolfin", 
            "Polaris",
            "Skyfire"
        };

        private static readonly HashSet<string> s_MobileDevices = new HashSet<string>
        {
            "BlackBerry", 
            "MI PAD", 
            "iPhone", 
            "iPad", 
            "iPod",
            "Kindle", 
            "Kindle Fire", 
            "Nokia", 
            "Lumia", 
            "Palm", 
            "DoCoMo",
            "HP TouchPad",
            "Xoom",
            "Motorola",
            "Generic Feature Phone",
            "Generic Smartphone"
        };

        #endregion

        private readonly HttpContextBase _httpContext;

        private string _rawValue;
        private UserAgentInfo _userAgent;
        private DeviceInfo _device;
        private OSInfo _os;

        private bool? _isBot;
        private bool? _isMobileDevice;
        private bool? _isTablet;
        private bool? _isPdfConverter;

        static UAParserUserAgent()
        {
            s_uap = uap.Parser.GetDefault();
        }

        public UAParserUserAgent(HttpContextBase httpContext)
        {
            this._httpContext = httpContext;
        }

        public string RawValue
        {
            get
            {
                if (_rawValue == null)
                {
                    if (_httpContext.Request != null)
                    {
                        _rawValue = _httpContext.Request.UserAgent.ToString();
                    }
                    else
                    {
                        _rawValue = "";
                    }
                }

                return _rawValue;
            }
            // for (unit) test purpose
            set
            {
                _rawValue = value;
                _userAgent = null;
                _device = null;
                _os = null;
                _isBot = null;
                _isMobileDevice = null;
                _isTablet = null;
                _isPdfConverter = null;
            }
        }

        public virtual UserAgentInfo UserAgent
        {
            get
            {
                if (_userAgent == null)
                {
                    var tmp = s_uap.ParseUserAgent(this.RawValue);
                    _userAgent = new UserAgentInfo(tmp.Family, tmp.Major, tmp.Minor, tmp.Patch);
                }
                return _userAgent;
            }
        }

        public virtual DeviceInfo Device
        {
            get
            {
                if (_device == null)
                {
                    var tmp = s_uap.ParseDevice(this.RawValue);
                    _device = new DeviceInfo(tmp.Family, tmp.IsSpider);
                }
                return _device;
            }
        }

        public virtual OSInfo OS
        {
            get
            {
                if (_os == null)
                {
                    var tmp = s_uap.ParseOS(this.RawValue);
                    _os = new OSInfo(tmp.Family, tmp.Major, tmp.Minor, tmp.Patch, tmp.PatchMinor);
                }
                return _os;
            }
        }

        public virtual bool IsBot
        {
            get
            {
                if (!_isBot.HasValue)
                {
                    _isBot = _httpContext.Request.Browser.Crawler || this.Device.IsBot;
                }
                return _isBot.Value;
            }
        }

        public virtual bool IsMobileDevice
        {
            get
            {
                if (!_isMobileDevice.HasValue)
                {
                    _isMobileDevice =
                        s_MobileOS.Contains(this.OS.Family) ||
                        s_MobileBrowsers.Contains(this.UserAgent.Family) ||
                        s_MobileDevices.Contains(this.Device.Family);
                }
                return _isMobileDevice.Value;
            }
        }

        public virtual bool IsTablet
        {
            get
            {
                if (!_isTablet.HasValue)
                {
                    _isTablet =
                        Regex.IsMatch(this.Device.Family, "iPad|Kindle Fire|Nexus 10|Xoom|Transformer|MI PAD|IdeaTab", RegexOptions.CultureInvariant) ||
                        this.OS.Family == "BlackBerry Tablet OS";
                }
                return _isTablet.Value;
            }
        }

        public virtual bool IsPdfConverter
        {
            get
            {
                if (!_isPdfConverter.HasValue)
                {
                    _isPdfConverter = s_pdfConverterPattern.IsMatch(this.RawValue);
                }
                return _isPdfConverter.Value;
            }
        }

    }
}


5) 修改HomeController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using UserDeviceDetectWebApplication.Service;
using System.Diagnostics;

namespace UserDeviceDetectWebApplication.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            UAParserUserAgent userAgent = new UAParserUserAgent(this.HttpContext);
            
            ViewBag.Os= userAgent.OS.ToString();
            ViewBag.Device = userAgent.Device.ToString();
            ViewBag.Agent = userAgent.UserAgent.ToString();
            ViewBag.RawValue = userAgent.RawValue.ToString();



            Debug.WriteLine("user os: "+userAgent.OS.ToString());
            Debug.WriteLine("user Device: " + userAgent.Device.ToString());
            Debug.WriteLine("user Agent: " + userAgent.UserAgent.ToString());
            Debug.WriteLine("user RawValue: " + userAgent.RawValue.ToString());

            if (userAgent.IsMobileDevice)
            {
                Debug.WriteLine("這是一個手機");
                ViewBag.MobilePc = "手機";
            }

            else if (userAgent.IsTablet)
            {
                ViewBag.MobilePc = "平板";
                Debug.WriteLine("這是一個平板");
            }

            else
            {
                ViewBag.MobilePc = "普通電腦";
                Debug.WriteLine("這是一個普通電腦");
            }
                
            return View();
        }
            
        

        
    }
}

 

6) 修改views\home\Index.cshtml

 

@{
    Layout = null;
    ViewBag.Title = "Home Page";
}

<p>
    用戶的 操做系統:@ViewBag.Os</br>
    用戶的設備: @ViewBag.Device </br>
    用戶的瀏覽器: @ViewBag.Agent </br>
    原始的用戶訪問設備信息: @ViewBag.RawValue </br>
    用戶使用的是 @ViewBag.MobilePc </br>
</p>

 

7) 編譯咱們的程序,運行它。試着用不一樣的瀏覽器,不一樣的手機訪問http://localhost:62526/Home/Index。端口號你的環境可能和個人不同哦。若是你不知道如何運行mvc的web程序,能夠諮詢我哦。

 

歡迎你們指正和討論。

相關文章
相關標籤/搜索