C#實現識別使用者訪問裝置方法的範例程式碼詳解

來源:互聯網
上載者:User
這篇文章主要介紹了.NET/C#實現識別使用者訪問裝置的方法,結合執行個體形式分析了C#識別使用者訪問裝置的操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下

本文執行個體講述了.NET/C#實現識別使用者訪問裝置的方法。分享給大家供大家參考,具體如下:

一、需求

需要擷取到使用者訪問網站時使用的裝置,根據不同裝置返回不同類型的渲染頁面。

二、實現前準備

通過NuGet把UAParser程式包添加到項目中

三、實現

建立UAParseUserAgent類檔案,在這個檔案中進行實現。

實現代碼如下:

public class UAParserUserAgent{    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;      }    }}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>());    }}

控制器中代碼:

UAParserUserAgent userAgent = new UAParserUserAgent(this.HttpContext);dto.OSInfo = userAgent.OS.ToString();dto.Device = userAgent.Device.ToString() != "Other" ? userAgent.Device.ToString() : "電腦";dto.Agent = userAgent.UserAgent.ToString();dto.RawValue = userAgent.RawValue.ToString();//if (userAgent.IsMobileDevice)//{//  Debug.WriteLine("這是一個手機");//  ViewBag.MobilePc = "手機";//}//else if (userAgent.IsTablet)//{//  ViewBag.MobilePc = "平板";//  Debug.WriteLine("這是一個平板");//}//else//{//  ViewBag.MobilePc = "普通電腦";//  Debug.WriteLine("這是一個普通電腦");//}

以上就是C#實現識別使用者訪問裝置方法的範例程式碼詳解的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.