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

作者:Mr-Robot 时间:2021-12-20 06:30:58 

本文实例讲述了.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#程序设计有所帮助。

标签:.NET,C#,访问设备
0
投稿

猜你喜欢

  • Java 迪杰斯特拉算法实现查找最短距离的实现

    2022-05-23 01:47:43
  • 基于java中的流程控制语句总结(必看篇)

    2023-11-08 09:56:59
  • C#操作ftp类完整实例

    2021-09-02 22:45:30
  • Android 基于百度语音的语音交互功能(推荐)

    2021-08-22 01:26:38
  • Java URL自定义私有网络协议

    2021-08-11 02:21:06
  • C#编程读取文档Doc、Docx及Pdf内容的方法

    2023-01-16 06:59:29
  • android自定义控件实现简易时间轴(1)

    2022-09-24 00:42:23
  • Spring Boot配置线程池拒绝策略的场景分析(妥善处理好溢出的任务)

    2022-08-05 07:12:24
  • C#中IEnumerable接口用法实例分析

    2022-03-24 12:40:21
  • C#实现解压GZip文件的方法

    2022-11-29 07:25:36
  • C#压缩或解压rar、zip文件方法实例

    2023-10-21 23:00:16
  • SpringMVC源码解读之 HandlerMapping - AbstractDetectingUrlHandlerMapping系列初始化

    2023-02-12 16:14:21
  • Feign远程调用Multipartfile参数处理

    2022-09-22 02:46:24
  • java写卷积神经网络(CupCnn简介)

    2022-12-11 09:33:09
  • SpringMVC通过模型视图ModelAndView渲染视图的实现

    2023-02-28 03:36:54
  • C++数组的定义详情

    2023-07-21 08:00:49
  • Springboot 整合RabbitMq(用心看完这一篇就够了)

    2023-11-23 05:27:17
  • Flutter实现手势识别功能详解方法

    2022-12-21 15:41:41
  • c# WPF中CheckBox样式的使用总结

    2023-07-17 15:44:46
  • Spring Boot 整合 TKMybatis 二次简化持久层代码的实现

    2021-06-17 06:21:26
  • asp之家 软件编程 m.aspxhome.com