本文实例讲述了.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#程序设计有所帮助。
dy("nrwz");
查看更多关于.NET/C#实现识别用户访问设备的方法的详细内容...