.NET/C#实现识别用户访问设备的方法
作者:Mr-Robot 发布时间:2021-12-20 06:30:58
标签:.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#程序设计有所帮助。


猜你喜欢
- 1.1 接口组成更新概述接口的组成常量:public static final抽象方法:public abstract默认方法(Java 8
- G将军有一支训练有素的军队,这个军队除开G将军外,每名士兵都有一个直接上级(可能是其他士兵,也可能是G将军)。现在G将军将接受一个特别的任务
- Integer获取第一位和最后一位并截取场景获取 5,10,15,25,30; 判断尾数为5的进入判断public static void
- 本文实现的功能有:1、 初始化游戏窗口2、初始化游戏的界面3、初始化游戏的说明面板4、随机生成下落方块5、方块下落速度变化6、判断方块是否可
- 前文传送门:ByteBuf使用subPage级别内存分配ByteBuf回收之前的章节我们提到过, 堆外内存是不受jvm垃圾回收机制控制的,
- java中初始化MediaRecorder实现代码:private boolean initializeVideo() { &
- 1.概述注解可以定义到方法上,类上,一个注解相当与一个类,就相当于实例了一个对象,加上了注解,就相当于加了一个标志。常用的注解:@Overr
- EntityWrapper的in用法EntityWrapper<UserLife> wrapper = new EntityWr
- XML对开发者来说十分的方便,不仅使用起来简单,而且能够及时调试,修改界面之后马上能看到效果。Java设置布局不具有这个优势。但是java却
- @MapperScan包扫描的坑在使用通用mapper执行查询时,由于不太注意顺手就导了spring的包:import org.mybati
- JMF这个多媒体开发框架太牛了,简单的几句代码就能实现一个视频播放器的开发,厉害,就是支持的格式少了一些,没关系,这个视频播放器可以播放mp
- 今天学习到了SpringBoot 的属性赋值@Value用法先总结@Value(" 张三 "):直接附在属性名上,在Be
- 继承JpaRepository,找不到findOne()方法问题:以前一直使用findOne(ID id);,这次用SpringBoot构建
- 博主说:有时候,我们需要对数据库中现有的数据进行大量处理操作(例如表中的某个字段需要全部更新等),如果直接使用select * from t
- 一.前言RabbitMQ的TTL全称为Time-To-Live,表示的是消息的有效期。消息如果在队列中一直没有被消费并且存在时间超过了TTL
- Android 使用FragmentTabhost代替Tabhost前言:现在Fragment使用越来越广了,虽然Fragment寄生在Ac
- 双保险线程,每次启动2个相同的线程,互相检测,避免线程死锁造成影响。两个线程都运行,但只有一个线程执行业务,但都会检测对方的时间戳 如果时间
- 这篇文章是android开发人员的必备知识,是我特别为大家整理和总结的,不求完美,但是有用。1.背景自适应且不失真问题的存在制作自适应背景图
- 本文实例讲述了C#日期格式字符串的相互转换操作。分享给大家供大家参考,具体如下:方法一:Convert.ToDateTime(string)
- 本系列代码地址:https://github.com/JoJoTec/spring-cloud-parentOpenFeign 的由来和实现