.NET/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#程序设计有所帮助。
上一篇:读写XML文件的内容并将其显示在ListView控件上的方法
栏 目:C#教程
下一篇:C# 特殊的string类型详解
本文标题:.NET/C#实现识别用户访问设备的方法
本文地址:https://www.xiuzhanwang.com/a1/C_jiaocheng/5924.html
您可能感兴趣的文章
- 01-10C#实现txt定位指定行完整实例
- 01-10WinForm实现仿视频 器左下角滚动新闻效果的方法
- 01-10C#实现清空回收站的方法
- 01-10C#实现读取注册表监控当前操作系统已安装软件变化的方法
- 01-10C#实现多线程下载文件的方法
- 01-10C#实现Winform中打开网页页面的方法
- 01-10C#实现远程关闭计算机或重启计算机的方法
- 01-10C#自定义签名章实现方法
- 01-10C#文件断点续传实现方法
- 01-10winform实现创建最前端窗体的方法


阅读排行
本栏相关
- 01-10C#通过反射获取当前工程中所有窗体并
- 01-10关于ASP网页无法打开的解决方案
- 01-10WinForm限制窗体不能移到屏幕外的方法
- 01-10WinForm绘制圆角的方法
- 01-10C#实现txt定位指定行完整实例
- 01-10WinForm实现仿视频 器左下角滚动新
- 01-10C#停止线程的方法
- 01-10C#实现清空回收站的方法
- 01-10C#通过重写Panel改变边框颜色与宽度的
- 01-10C#实现读取注册表监控当前操作系统已
随机阅读
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 01-11ajax实现页面的局部加载
- 04-02jquery与jsp,用jquery
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 01-10delphi制作wav文件的方法
- 08-05DEDE织梦data目录下的sessions文件夹有什
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 01-10SublimeText编译C开发环境设置
- 01-10C#中split用法实例总结