ASP.NET 浏览器检测






4.63/5 (51投票s)
使用和更新您的 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 日 - 更新了资源部分