ホームページ  >  記事  >  バックエンド開発  >  ユーザーアクセスデバイスメソッドを識別するC#実装のサンプルコードの詳細説明

ユーザーアクセスデバイスメソッドを識別するC#実装のサンプルコードの詳細説明

黄舟
黄舟オリジナル
2017-03-06 11:23:441471ブラウズ

この記事では、ユーザー アクセス デバイスを識別する .NET/C# 方法を主に紹介し、ユーザー アクセス デバイスを識別するための C# の操作テクニックを例の形で分析します。必要な友人は参考にすることができます。この記事の例では、.NET/C# がユーザー アクセス デバイスを識別するメソッドを実装する方法について説明します。参考のために皆さんと共有してください。詳細は次のとおりです:

1. 要件

Webサイトにアクセスするためにユーザーが使用したデバイスを取得し、異なるデバイスに応じて異なる種類のレンダリングページを返す必要があります。 。

2.実装前の準備

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# のサンプル コードの詳細な内容です。関連コンテンツについては、PHP 中国語 Web サイト (www.php .cn) にご注意ください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。