65.9K
CodeProject 正在变化。 阅读更多。
Home

ASP.NET 浏览器检测

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.63/5 (51投票s)

2004 年 6 月 2 日

CPOL

5分钟阅读

viewsIcon

580634

downloadIcon

6370

使用和更新您的 machine.config 文件以更好地检测 ASP.NET 中的浏览器类型

旧方法:在 ASP 中确定浏览器类型

在 Web 开发中,了解哪个浏览器正在查看您提供的页面通常很重要。传统的 ASP 应用程序使用位于 \system32\inetsrv\browscap.dll DLL 中的浏览器能力对象。该对象获取浏览器发送到网站的用户代理字符串,并将其与 browscap.ini 文件中的简单通配符表达式列表进行比较,以确定当前请求页面的浏览器类型。

browsercap.ini 文件具有以下形式

[IE 6.0]
browser=IE
version=6
majorver=6
minorver=0
css=2
frames=True
iframes=True
tables=True
cookies=True
backgroundsounds=True
vbscript=True
javascript=True
javaapplets=True
activexcontrols=True
cdf=True
aol=False
beta=False
win16=False
crawler=False
stripper=False
wap=False
netclr=False
AK=False
SK=False

[Mozilla/4.0 (compatible; MSIE 6.0*;*Windows NT 5.1*)*]
parent=IE 6.0
platform=WinXP

如果表达式 Mozilla/4.0 (compatible; MSIE 6.0*;*Windows NT 5.1*)* 匹配浏览器发送的用户代理字符串,那么该浏览器将被标识为 WinXP 平台上的 IE 6.0,并具有 [IE 6.0] 部分定义的属性。该文件是可扩展的,您可以添加自己的属性(如“crawler”、“stripper”等),并为 Firebird 和 Firefox 等较新浏览器添加自己的浏览器嗅探过滤器。

要在 ASP 页面中访问此信息,您可以执行类似以下操作

Dim BT
Set BT = Server.CreateObject("MSWC.BrowserType")

Dim BrowserName    : BrowserName    = BT.Browser
Dim BrowserVersion : BrowserVersion = BT.Version

Set BT = nothing

这种方法的主要问题是,新浏览器的新版本需要一个新的条目。当 IE 7 发布时,您将不得不更新您的 browscaps.ini 文件。如果您不这样做,您可能会向读者错误地呈现页面,或者基于错误的假设禁用功能。

新方法:在 ASP.NET 中确定浏览器类型

ASP.NET 通过引入更强大的基于正则表达式的方法来解决这个问题。ASP.NET 浏览器检测不依赖于简单的通配符搜索,而是使用正则表达式进行更复杂的测试和数据提取。下面给出了浏览器嗅探表达式格式的示例

<browserCaps>
    <use var="HTTP_USER_AGENT" />
    <filter>
        <!-- Opera -->
        <case match="Opera[ /](?'version'(?'major'\d+)(?'minor'\.\d+)(?'letters'\w*))">
            browser=Opera
            version=${version}
            majorversion=${major}
            minorversion=${minor}
            frames=true    
            tables=true
            cookies=true
            javascript=true
            ecmascriptversion=1.1
            isMobileDevice="true"

            <filter match="[4-9]" with="${major}">
                ecmascriptversion=1.3
                css1=true
                css2=true
                xml=true

                <filter match="[5-9]" with="${major}">
                    w3cdomversion=1.0    
                </filter>
            </filter>
            <filter match="^b" with="${letters}">
                beta=true
            </filter>
        </case>

此分支指定应将从浏览器发送的 HTTP_USER_AGENT 标头与后续的 <filter> 表达式进行匹配。您会注意到该表达式与传统的 ASP 方法不同,因为可以从匹配项中提取信息并将提取的值分配给浏览器属性。例如,当用户代理字符串

Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2) Opera 7.23 [en]

与表达式匹配

Opera[ /](?'version'(?'major'\d+)(?'minor'\.\d+)(?'letters'\w*))

时,'version'、'major' 和 'minor' 的值将分别设置为 '7.23'、'7' 和 '.23'。

要访问此信息,您可以执行类似以下操作

<% 
    Response.Write(Request.Browser.Browser.ToString());
    Response.Write(Request.Browser.Version.ToString());
%>

更新浏览器和平台类型

浏览器匹配正则表达式包含在您的 \WINDOWS\Microsoft.NET\Framework\v1.1.4322\CONFIG\ 目录下的 machine.config 文件的 configuration/system.web/browsercaps 部分。

如果您希望添加一个新平台(例如 Windows 2003 或 Longhorn),则可以在 <use var="HTTP_USER_AGENT" /> 指令下的 browsercaps 分支下添加一个新过滤器。

<filter>
    <case match="Windows NT 5.2|Windows 2003">
        platform=Win2003
    </case>
</filter>

要添加一个表达式来检测基于 Gecko 的浏览器,您可以添加

<case match="^Mozilla/5\.0 \([^)]*\) (Gecko/[-\d]+)? (?'type'[^/\d]*)([\d]*)
/(?'version'(?'major'\d+)(?'minor'\.\d+)(?'letters'\w*)).*">
    browser=Gecko
    type=${type}
    frames=true
    tables=true
    cookies=true
    javascript=true
    javaapplets=true
    ecmascriptversion=1.5
    w3cdomversion=1.0
    css1=true
    css2=true
    xml=true
    tagwriter=System.Web.UI.HtmlTextWriter
    <case match="rv:(?'version'(?'major'\d+)(?'minor'\.\d+)(?'letters'\w*))">
        version=${version}
        majorversion=${major}
        minorversion=${minor}
        <case match="^b" with="${letters}">
            beta=true
        </case>
    </case>
</case>

这里的重点是,该浏览器将来的版本将自动被检测到。只要您的依赖于浏览器的代码的形式是 if BrowserVersion >= X then ...(并假设该特定浏览器保持向后兼容性),您就没事了。

问题以及您如何提供帮助

随着新浏览器的不断发布,以及新的蜘蛛、爬虫和站点剥离器被编写出来,确保您的配置文件是最新的是一项艰巨的任务。微软没有承诺更新 machine.config 文件,而是让 cyScape, Inc. 来完成这项工作。问题在于它没有被更新,事实上现在它似乎已经被完全删除了。

Rob Eberhardt 在 http://slingfive.com/pages/code/browserCaps/ 上提供了一个 machine.config 文件的更新,其中包含 Gecko、Safari 和 Konqueror 浏览器,我对如何包含 Windows 2003 检测进行了一个小的更新。Gary Keith 在 http://www.garykeith.com/browsers/ 上维护着一个出色的 browsercap.ini 文件,该文件不仅列出了浏览器,还列出了所有已检测到的爬虫、蜘蛛和剥离器。Gary 做了一项出色的工作。

Rob Eberhardt 和我希望利用 CodeProject 社区的综合资源,以及 Gary 提供的汇总信息,来启动我们自己的 CodeProject 维护的 ASP.NET machine.config 文件的浏览器能力编译。在您的帮助下,我们可以确保我们的浏览器检测是最新的。

一个测试页面已在此处 提供。如果您有浏览器被错误报告或未被检测到,请告知我们,或者更好的是,花时间确定所需的表达式匹配并将其发送过来,以便我们合并。更好的是,如果有人有时间和耐心来开发一个数据库驱动的配置文件生成器,那将自动化该过程并加快更新速度。

目前,我们将尽最大努力确保当前文件尽可能频繁地更新。现在轮到您了。

资源

历史

  • 2004 年 6 月 2 日 - 首次发布
  • 2004 年 12 月 9 日 - Rob Eberhardt 更新了 XML 文件以正确识别纯(非 Firefox)Mozilla,遗漏了一些 Safari 和 Konqueror 的变体,并添加了一个 Opera 部分
  • 2005 年 7 月 4 日 - 由 Owen Brady 提供的用户代理更新了 XML 文件、NUnit 测试库和简单的命令行工具
  • 2005 年 10 月 10 日 - 由 Owen Brady 更新了 XML 文件,以更新 Opera/Gecko/AppleWebKit 浏览器。主要是根据其网站信息正确识别版本和其他设置
  • 2006 年 5 月 18 日 - 使用 JWhite 的建议更新了 XML 文件。
  • 2006 年 7 月 25 日 - Owen Wilson 为 Opera/Gecko/AppleWebKit 浏览器提供了更多更新
  • 2009 年 5 月 6 日 - 更新了资源部分
© . All rights reserved.