【问题标题】:HttpBrowserCapabilities missing some information?HttpBrowserCapabilities 缺少一些信息?
【发布时间】:2011-05-12 14:24:22
【问题描述】:

我想使用Request.Browser 属性(HttpBrowserCapabilities 类)来确定客户端系统的一些属性。

但是我似乎遇到了这个类的一些限制。我无法从UserAgent 字符串中找到一些应该相对容易解析的属性,例如操作系统版本(Platform 只会在大多数 Windows 版本中返回 WinNT,而不是 Vista、XP 等),或者它是否是x64 与否(仅限 Win16Win32 属性)。

我本来希望在HttpBrowserCapabilities 类中看到这些属性,因为大多数其他用户代理信息都在那里。我错过了什么吗?我可以在其他地方找到这些信息吗?还是我应该自己从 UserAgent 字符串中解析它?

【问题讨论】:

  • 顺便说一下,Win32 在 64 位 Windows 上是正确的,至少在我的 Windows 7 Professional(64 位)机器上是这样。

标签: c# .net asp.net user-agent httpbrowsercapabilities


【解决方案1】:

browserCaps 元素在 ASP.NET 2.0 及更高版本中已弃用。除非您使用的是 .NET 1 或 1.1,否则您应该改用浏览器定义文件。

将 *App_Browsers* 文件夹添加到您的站点(如果它尚不存在),并创建一个名为“Platforms.browser”的新文件。 (名称无关紧要;只有扩展名。)

打开新的 .browser 文件并粘贴以下内容:

<browsers>
    <gateway id="PlatformWinVista" parentID="PlatformWinnt">
        <identification>
            <userAgent match="Windows NT 6\.0" />
        </identification>
        <capabilities>
            <capability name="platform" value="Windows Vista" />
        </capabilities>
    </gateway>

    <gateway id="PlatformWin7" parentID="PlatformWinnt">
        <identification>
            <userAgent match="Windows NT 6\.1" />
        </identification>
        <capabilities>
            <capability name="platform" value="Windows 7" />
        </capabilities>
    </gateway>
</browsers>

您可能需要触发重新编译站点以使新文件生效。

注意:这些节点必须是 gateway 节点,而不是 browser 节点。如果您尝试将它们创建为 browser 节点,您将获得 parser error when your site recompiles

【讨论】:

    【解决方案2】:

    您可以通过在 machine.config/web.config 文件中添加/扩展 browserCaps 配置部分来扩展 HttpBrowserCapabilities。例如,要更准确地检测操作系统版本,请在配置文件中添加如下内容:

    <system.web>
        <browserCaps>
          <use var="HTTP_USER_AGENT" />
          <filter>
            <case match="Windows NT 6.1">
              platform=Windows7
            </case>
          </filter>
        </browserCaps>
      </system.web>
    

    如果您使用在 Windows 7 上运行的 Mozilla (UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1") 访问该网站,您会看到Request.Browser.Platform 将显示“Windows7”。更多信息请看这里:http://msdn.microsoft.com/en-us/library/sk9az15a%28v=vs.71%29.aspx

    在 browserCaps 部分添加一个正则表达式以匹配 WOW64 字符串,以检测客户端平台是否为 64 位(我不确定 WOW64 等效项对于在 64 位上运行的非 Windows 平台是什么)。

    ...当然,通过在元素中使用正则表达式,除了自己实际解析 UserAgent 字符串外,您什么也不做。但是,您可以在网络上轻松找到预定义的 browseCap(例如 http://owenbrady.net/browsercaps/CodeProject.xml)。

    请记住,尽管此功能非常强大,但仍不是 100% 准确。例如,Windows 7 和 Windows Server 2008 R2 都将返回 Windows NT 6.1 作为平台。

    【讨论】:

    • 谢谢@matk,可惜它需要自定义插件。
    • @Quimica - 确实如此,但话又说回来,人们必须意识到新的浏览器/操作系统版本(以及随之而来的新用户代理字符串)如此频繁地出现,以至于 .NET 无法可能开箱即用地覆盖它们。
    猜你喜欢
    • 2022-01-26
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多