• 技术文章 >后端开发 >C#.Net教程

    C#实现识别用户访问设备方法的示例代码详解

    黄舟黄舟2017-03-06 11:23:44原创722
    这篇文章主要介绍了.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#实现识别用户访问设备方法的示例代码详解的内容,更多相关内容请关注PHP中文网(m.sbmmt.com)!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    上一篇:C#实现判断文件夹存在与否并创建文件夹的示例代码 下一篇:C#中 线程同步代码详细介绍
    20期PHP线上班

    相关文章推荐

    • 【活动】充值PHP中文网VIP即送云服务器• C语言入门之聊聊基础知识(数据类型、变量、函数、数组等)• 聊聊如何利用纯C语言对EXCEL进行读写操作• c语言中node是什么意思• C语言必背18个经典程序,C语言初学者必会(收藏)• Redis教程(十五):C语言连接操作代码实例
    1/1

    PHP中文网