C# 在ASP.NET中是否可以从HTTP请求派生浏览器主版本';单独的用户代理字符串?

C# 在ASP.NET中是否可以从HTTP请求派生浏览器主版本';单独的用户代理字符串?,c#,asp.net,iis,51degrees,C#,Asp.net,Iis,51degrees,我们有一个应用程序,它使用Request.Browser.MajorVersion作为缓存键的一部分。我们很难确定一组历史请求使用了哪个缓存密钥。为此,我们正在分析IIS日志,因此需要确定每个请求的ASP.NET的Request.Browser.MajorVersion的值。是否可以仅从用户代理字符串中派生 更新 我最初假设Request.Browser.MajorVersion的值是直接从用户代理字符串获取的版本。然而,在一次确认这一理论的调试会话中,我看到: 我本以为Request.Bro

我们有一个应用程序,它使用
Request.Browser.MajorVersion
作为缓存键的一部分。我们很难确定一组历史请求使用了哪个缓存密钥。为此,我们正在分析IIS日志,因此需要确定每个请求的ASP.NET的
Request.Browser.MajorVersion
的值。是否可以仅从用户代理字符串中派生

更新

我最初假设
Request.Browser.MajorVersion
的值是直接从用户代理字符串获取的版本。然而,在一次确认这一理论的调试会话中,我看到:

我本以为Request.Browser.MajorVersion是61,而不是44。任何人都可以提供这些值不同的原因,以及我如何能够自信地说出给定用户代理字符串的
Request.Browser.MajorVersion
的值

更新2

我发现ASP.NET使用一组模板将
HttpBrowserCapabilities
对象集构建为
Request.Browser
。可从以下网址获得:

%SystemRoot%\Microsoft.NET\Framework[版本]\Config\Browsers

查看模板,它们都使用regex解析用户代理字符串(我在下面粘贴了chrome.browser的内容),这表明
Request.browser.MajorVersion
应该与用户代理字符串中的值对应。所以仍然不知道为什么我的本地应用程序返回44作为该值

<browsers>
    <!-- Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/530.1 (KHTML, like Gecko) Chrome/2.0.168.0 Safari/530.1 -->
    <browser id="Chrome" parentID="WebKit">
        <identification>
            <userAgent match="Chrome/(?'version'(?'major'\d+)(\.(?'minor'\d+)?)\w*)" />
        </identification>

        <capabilities>
          <capability name="browser"                         value="Chrome" />
          <capability name="majorversion"                    value="${major}" />
          <capability name="minorversion"                    value="${minor}" />
          <capability name="type"                            value="Chrome${major}" />
          <capability name="version"                         value="${version}" />
          <capability name="ecmascriptversion"               value="3.0" />
          <capability name="javascript"                      value="true" />
          <capability name="javascriptversion"               value="1.7" />
          <capability name="w3cdomversion"                   value="1.0" />
          <capability name="supportsAccesskeyAttribute"      value="true" />
          <capability name="tagwriter"                       value="System.Web.UI.HtmlTextWriter" />
          <capability name="cookies"                         value="true" />
          <capability name="frames"                          value="true" />
          <capability name="javaapplets"                     value="true" />
          <capability name="supportsCallback"                value="true" />
          <capability name="supportsDivNoWrap"               value="false" />
          <capability name="supportsFileUpload"              value="true" />
          <capability name="supportsMaintainScrollPositionOnPostback" value="true" />
          <capability name="supportsMultilineTextBoxDisplay" value="true" />
          <capability name="supportsXmlHttp"                 value="true" />
          <capability name="tables"                          value="true" />
        </capabilities>
    </browser>
</browsers>

更新3

我终于弄清了这件事的真相。事实证明,我正在调试的应用程序使用的是一个名为的第三方服务,该服务截获请求并应用自己对请求头的解析,在本例中使用的是安装在应用程序服务器本地的数据库。此数据库已过时,因此对于nmore最新的浏览器版本产生了奇怪的结果。我在上面更新2中的详细信息对普通ASP.NET应用程序有效,但这确实解释了为什么我的结果与普通测试环境不同。感谢所有抽出时间帮助我调查此事的人。

非常具有挑战性

此页面将告诉您代理字符串:

此页面将显示大多数浏览器的代理字符串

某些浏览器在代理字符串中有主/次版本。有些则不然。浏览器之间甚至浏览器版本之间的格式各不相同,因此,即使您知道代理字符串中存在主版本,解析它仍然可以特定于每个浏览器/版本


如果您真的需要这样做,最好找到一个保持最新且维护良好的库。

有帮助吗?谢谢。我没有遇到过这个。我只是尝试了一下,但它似乎没有将sme主要版本作为.NET框架返回。例如,传入用户代理“Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,类似Gecko)Chrome/61.0.3163.100 Safari/537.36”时,返回61作为主要版本。但是ASP.NET中的同一用户代理的Request.Browser.MajorVersion==44。我不知道.NET是从哪里得到44的…当61显然是正确答案时,你想要44有什么特别的原因吗?简短的答案是“不”,至少不是100%可靠,因为有些浏览器会让你玩useragent字符串。但你也许能靠得足够近以满足你的需要。我无法复制你的结果。在我的调试会话中,Chrome 61.0返回
Request.Browser.MajorVersion
==61,Firefox 56.0返回56,Edge(稍微令人满意)返回
Request.Browser.Browser
=
Chrome
Request.Browser.MajorVersion
==52。所有这些值都存在于
UserAgent
字符串中。