如果您发现没有任何现有的浏览器定义文件符合您的条件,则可以通过使用下面的示例一节中的代码创建新的浏览器定义文件。
安全注意 |
|---|
| 仅下载或安装来自受信任源的第三方的浏览器定义文件。检查新的浏览器定义文件,以查看是否引用了任何不熟悉的命名空间。有关更多信息,请参见保证浏览器定义文件的安全。 |
预定义的浏览器定义文件存储在 %SystemRoot%\Microsoft.NET\Framework\version\CONFIG\Browsers 目录中。应用程序级别的浏览器定义文件可以放在应用程序的 App_Browsers 目录中。在这两个位置中,浏览器定义文件都必须具有 .browser 文件扩展名。不要更改 ASP.NET 随附的浏览器定义文件,因为 Service Pack 可能会更新这些文件,从而改写您所做的更改。相反,您应该创建新的 .browser 文件,并在新的 browser 定义中使用 parentID 属性来继承设置,或者使用 refID 属性向现有的浏览器定义添加功能。
在运行时,浏览器定义文件信息将合并到 BrowserCapabilitiesFactory 对象中的已知浏览器的集合内。发出请求时,ASP.NET 根据请求标头标识请求的浏览器,并编译一个与请求的浏览器类型相对应的 HttpBrowserCapabilities 对象。这一步是这样完成的:在开始时使用一个空字典,然后对浏览器定义树应用以下递归步骤:
-
从默认浏览器定义开始,默认浏览器定义始终被认为是一个成功的匹配。
-
将此浏览器定义中指定的功能值合并到此浏览器的功能字典中。浏览器定义中指定的值会重写父浏览器定义中设置的值。
-
计算每个子定义以确定是否匹配。对于每个匹配的子定义,重新从步骤 1 开始。在网关定义之后计算浏览器定义。如果用户代理匹配多个浏览器定义或多个网关定义,将会在运行时引发异常。
HttpBrowserCapabilities 对象被写入缓存,可以被来自同一类型的浏览器发出的其他请求再次使用。
Web 应用程序可以使用 System.Web.HttpRequest.Browser 属性访问 HttpBrowserCapabilities 对象的当前实例。此对象是只读的,并包含每个功能的属性。或者,Web 开发人员可以构建一个从 HttpBrowserCapabilities 类继承的自定义类,并在 System.Web.HttpRequest.Browser 属性中存储一个实例。
对位于 App_Browsers 目录中的 .browser 文件所做的更改会使缓存无效,并且下一次请求将导致应用程序重新编译。但是,如果对 %SystemRoot%\Microsoft.NET\Framework\version\CONFIG\Browsers 目录中的 .browser 文件做出了更改,您必须使用 %SystemRoot%\Microsoft.NET\Framework\version\aspnet_regbrowsers.exe 工具手动重新编译应用程序,或者使用 BrowserCapabilitiesCodeGenerator 类以编程方式重新编译应用程序。
注意 |
|---|
| 使用 Web.config 文件中的 browserCaps 元素来定义浏览器的行为在 .NET Framework 2.0 中被否决,但仍受支持。此元素中的数据与浏览器定义文件中的信息合并在一起。 |
浏览器对应用程序发出请求时,浏览器的功能存储在 Browser 属性中,浏览器的标识则存储在 UserAgent 属性中。ASP.NET Web 服务器控件查询功能列表,以决定如何针对不同的浏览器适当地改编控件的行为。

功能
若要查看强类型浏览器功能的列表,请参见 HttpCapabilitiesBase 类的属性。这些属性在浏览器定义文件中使用 Camel 大小写格式。例如,如果您希望在浏览器定义文件中指定 BackgroundSounds 功能,则键入 backgroundSounds。
您也可以定义自己的功能。
Web 应用程序可以通过下列两种方式之一检索 HttpBrowserCapabilities 对象中的功能值:

默认配置
.NET Framework 随附有预定义的浏览器定义文件,这些文件位于 %SystemRoot%\Microsoft.NET\Framework\version\CONFIG\Browsers 目录中。您可以在应用程序的 App_Browsers 目录中创建应用程序级别的浏览器定义文件。有关特殊的 ASP.NET 目录的信息,请参见 ASP.NET 网站布局。
下面的代码示例摘自 %SystemRoot%\Microsoft.NET\Framework\version\CONFIG\Browsers 目录中的 Generic.browser 文件。
注意 |
|---|
| 不要更改 %SystemRoot%\Microsoft.NET\Framework\version\CONFIG\Browsers 目录中现有的浏览器定义文件。这些文件是由 .NET Framework 维护的。 |
<browsers>
<browser id="GenericDownlevel" parentID="Default">
<identification>
<userAgent match="^Generic Downlevel$" />
</identification>
<capture>
</capture>
<capabilities>
<capability name="cookies" value="false" />
<capability name="ecmascriptversion" value="1.0" />
<capability name="tables" value="true" />
<capability name="type" value="Downlevel" />
</capabilities>
<controlAdapters>
<adapter controlType="System.Web.UI.WebControls.Menu"
adapterType="System.Web.UI.WebControls.Adapters.MenuAdapter" />
</controlAdapters>
</browser>
</browsers> 下面的代码示例摘自 %SystemRoot%\Microsoft.NET\Framework\version\CONFIG\Browsers 目录中的 WebTV.browser 文件。
<browsers>
<browser id="WebTV" parentID="IE2">
<identification>
<userAgent match="WebTV/(?'version'(?'major'\d+)(?'minor'\.\d+)(?'letters'\w*))" />
</identification>
<capture>
</capture>
<capabilities>
<capability name="backgroundsounds" value="true" />
<capability name="browser" value="WebTV" />
<capability name="cookies" value="true" />
<capability name="isMobileDevice" value="true" />
<capability name="letters" value="${letters}" />
<capability name="majorversion" value="${major}" />
<capability name="minorversion" value="${minor}" />
<capability name="tables" value="true" />
<capability name="type" value="WebTV${major}" />
<capability name="version" value="${version}" />
</capabilities>
<controlAdapters markupTextWriterType="System.Web.UI.Html32TextWriter">
</controlAdapters>
</browser>
<browser id="WebTV2" parentID="WebTV">
<identification>
<capability name="minorversion" match="2" />
</identification>
<capture>
</capture>
<capabilities>
<capability name="css1" value="true" />
<capability name="ecmascriptversion" value="1.0" />
<capability name="javascript" value="true" />
</capabilities>
</browser>
<gateway id="WebTVbeta" parentID="WebTV">
<identification>
<capability name="letters" match="^b" />
</identification>
<capture>
</capture>
<capabilities>
<capability name="beta" value="true" />
</capabilities>
</gateway>
</browsers>