好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

.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#程序设计有所帮助。

dy("nrwz");

查看更多关于.NET/C#实现识别用户访问设备的方法的详细内容...

  阅读:44次