.NET/C#实现识别用户访问设备的方法

 更新时间:2017年02月10日 11:41:51   作者:Mr-Robot  
这篇文章主要介绍了.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#相关内容感兴趣的读者可查看本站专题:《C#程序设计之线程使用技巧总结》、《WinForm控件用法总结》、《C#中XML文件操作技巧汇总》、《C#常见控件用法教程》、《C#数据结构与算法教程》、《C#数组操作技巧总结》及《C#面向对象程序设计入门教程

希望本文所述对大家C#程序设计有所帮助。

相关文章

  • C#编程自学之流程控制语句

    C#编程自学之流程控制语句

    本文主要介绍流程控制语句,主要包括条件控制语句和循环控制语句的使用。读者学习本文后,应该熟练掌握C#控制语句的主要用途和使用方法,了解这些控制语句的区别。
    2015-10-10
  • 基于C#编写一个合并多个Word文档的工具

    基于C#编写一个合并多个Word文档的工具

    这篇文章主要为大家详细介绍了如何使用C#编写一个小工具,可以实现把多个word文档进行合并成一个word文档,感兴趣的小伙伴可以了解下
    2024-02-02
  • C#版ftp方法实现类的代码

    C#版ftp方法实现类的代码

    C#版ftp方法实现类的代码...
    2007-04-04
  • Win10 系统下VisualStudio2019 配置点云库 PCL1.11.0的图文教程

    Win10 系统下VisualStudio2019 配置点云库 PCL1.11.0的图文教程

    这篇文章主要介绍了Win10 系统下VisualStudio2019 配置点云库 PCL1.11.0的图文教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • C# winform编程中响应回车键的实现代码

    C# winform编程中响应回车键的实现代码

    这篇文章主要介绍了C# winform编程中响应回车键的实现代码,既在窗口上响应回车键事件的方法,需要的朋友可以参考下
    2014-08-08
  • C# 将透明图片的非透明区域转换成Region的实例代码

    C# 将透明图片的非透明区域转换成Region的实例代码

    以下代码实现将一张带透明度的png图片的非透明部分转换成Region输出的方法,有需要的朋友可以参考一下
    2013-10-10
  • C#中的集合用法分析

    C#中的集合用法分析

    这篇文章主要介绍了C#中的集合用法,实例形式分析了集合元素的定义、赋值、插入、移除等操作,需要的朋友可以参考下
    2014-10-10
  • C#中通过使用Connection类来实现打开/关闭数据库的代码实例

    C#中通过使用Connection类来实现打开/关闭数据库的代码实例

    今天小编就为大家分享一篇关于C#中通过使用Connection类来实现打开/关闭数据库的代码实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • c# Winform 程序自动更新实现方法

    c# Winform 程序自动更新实现方法

    Winform程序自动更新我也是第一次做,网上找了自动更新的源码,后来又根据在网上看到的一些方法,自己试了很久,最终还是有写错误,所以花了钱让别人帮忙调试成功的,下面是我自己捣腾出来的,方便大家借鉴,如果有什么错误的地方欢迎指正
    2017-02-02
  • c# 模拟串口通信 SerialPort的实现示例

    c# 模拟串口通信 SerialPort的实现示例

    本文主要介绍了c# 模拟串口通信 SerialPort的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05

最新评论