确定 ASP.NET 中浏览器的功能

本页内容
HTTP 标头和用户代理HTTP 标头和用户代理
确定浏览器功能确定浏览器功能
将标头映射到浏览器功能将标头映射到浏览器功能
上级浏览器与下级浏览器上级浏览器与下级浏览器
定义新的浏览器定义新的浏览器
测试测试
创建自己的目标创建自己的目标
HtmlTextWriter 和 HtmlTextWriter32HtmlTextWriter 和 HtmlTextWriter32
移动浏览器功能移动浏览器功能
小结小结

Web 应用程序不同于运行在同源环境中的其他应用程序,因为前者会将输出发送到各种各样的平台和 Web 浏览器。有些浏览器支持客户端脚本,有些支持 XHTML,还有一些会限制屏幕区域。那么您的 Web 应用程序如何将内容传递给具有限制功能或具有特殊要求的浏览器呢?

为了回答这个问题,我将深入研究 ASP.NET 1.1 的支持,旨在确定浏览器的功能。要查看 ASP.NET 2.0 中即将推出的功能,请参阅提要栏“ASP.NET 2.0 中浏览器的功能”。[编辑更新 — 2004 年 12 月 14 日:提要栏已经更新。]

HTTP 标头和用户代理


确定将请求发送到您的 Web 站点的浏览器功能的第一步是,查明浏览器属于哪种类型。在 HTTP 标头中发送的有效负载包含了用户代理字符串,它描述了发出请求的浏览器。虽然,通常您看不到由客户端浏览器发送给远程 Web 站点的标头,但您可以使用 TCP 跟踪应用程序来查看。我使用 TCPTrace(由 Simon Fell 和 Matt Humphrey 编写的一个应用程序)来检验标头。图 1 显示某种 Web 请求的标头转储。

请注意图 2 中的用户代理字符串。在您的 ASP.NET 应用程序中,您可以通过编程方式轻松地从标头集合中提取字符串。在应用程序中启用跟踪时,您也可以查看用户代理字符串,如图 3 所示。


图 3 所显示的 HTTP_USER_AGENT 字符串


这很顺利,但是您可以用这些信息来做什么呢?只有当您知道附加给每个浏览器版本的功能是什么时,它们才会有用。在传统的 ASP 和 ASP.NET 中,各种不同浏览器的功能记录在辅助文件中。

确定浏览器功能


在传统的 ASP 中,DLL %windir%/System32/inetsrv/browscap.dll 包含一个类,该类根据传入的用户代理字符串来确定浏览器的功能。浏览器功能对象会检查 %windir%/System32/inetsrv/browscap.ini,以将用户代理字符串与 .ini 文件中的特定部分相匹配,该文件描述了这个浏览器的一些众所周知的功能。(ATL 服务器是用于创建 ISAPI DLL 的 C++ 模板库,它也使用 browscap.ini 来确定浏览器功能。有关 ATL 服务器的更多信息,请查看 MSDN®Magazine 2003 年 11 月一期中的 ASP 专栏。)

图 4 显示了 browscap.ini 文件的一部分,它说明将自己识别为 Microsoft® Internet Explorer 2.0 的浏览器的功能。这部分 .ini 文件表明 Internet Explorer 既不支持客户端脚本,也不支持 Java 小程序。

要使用传统 ASP 应用程序中的信息,您必须在脚本块中创建 BrowserType 对象(它是具有“MSWC.BrowserType”的 ProgID 的 COM 对象),并查询它的属性,以获得诸如浏览器名称、版本以及是否支持 cookie 等信息。您可以通过这些信息准确地传送您的内容。

ASP.NET 包含用于询问浏览器功能的 HttpBrowserCapabilities 类。HttpRequest 类包含对 HttpBrowserCapabilties 类的实例的引用,因此它通常在整个应用程序中都可用。您可以从当前的 Page 实例或 HttpContext 类的当前实例中提取它。HttpBrowserCapabilities 包含许多属性及其意义,正如您在图 5 中所见。

大多数浏览器功能的意义都显而易见,您可以使用所提供的信息来调整您的输出。例如,如果您有一个脚本,那么只有当另一端的浏览器理解它时,您才会将它发送到客户端,我用图 6 中的代码进行了说明。

将标头映射到浏览器功能


在本专栏的 2004 年 9 月一期中,我看到了 ASP.NET 配置以及 ASP.NET 如何用特定的处理程序来解释配置文件中的各个部分。现在让我们来看一下 Machine.config 文件的各个部分,Machine.config 文件是 ASP.NET 中配置的起点。在靠近文件顶端的位置,您将看到一个提供组件名称的节点,该组件可解释用户代理字符串以确定浏览器的功能:

<sectionGroup name="system.web">
  <section name="browserCaps"
    type="System.Web.Configuration.HttpCapabilitiesSectionHandler, 
      System.Web, Version=1.0.5000.0, Culture=neutral,
      PublicKeyToken=b03f5f7f11d50a3a"/>
  ...
</sectionGroup>

如您所见,名为“HttpCapabilitiesSectionHandler”的类型用于解析配置文件的<browserCaps> 部分。在解析浏览器配置设置之后,对于每个请求,它都查看 HTTP 标头并使用它们来确定客户端浏览器功能。Machine.config 中的<browserCaps> 元素包含 HTTP 标头与特定浏览器功能之间的映射。每个请求都用这些信息来填充 HttpBrowserCapabilities 类。请注意,浏览器功能特性不只匹配用户代理字符串。任何入站标头都可以匹配,并用作为该 HttpBrowserCapabilities 对象设置的值的一部分。图 7 显示了 Machine.config 文件的<browserCaps> 部分中的一些代码。

<browserCaps>部分定义了表示功能的一组键值对。深入 Machine.config 文件后,您会看到这些变量与各种用户代理字符串中特定正则表达式之间的映射。例如,您会在<browserCaps> 标记之间看到表示客户端版本的正则表达式。如果 HttpBrowserCapabilitiesHandler 与用户代理字符串中的平台字符串匹配,则说明 HttpBrowserCapabilitiesHandler 正确设置了平台属性:

<case match="Windows NT 5.1|Windows XP">
  platform=WinXP
</case>
<case match="Windows NT 5.0|Windows 2000">
  platform=Win2000
</case>

上级浏览器与下级浏览器


正如 Machine.config 中定义的那样,浏览器分为两个主要类型:上级和下级。上级浏览器支持 HTML 4.0、层叠样式表、ECMAScript 1.2 版(JScript® 和 JavaScript)以及与 W3C 兼容的文档对象模型 (Document Object Model)。下级浏览器和客户端设备仅支持 HTML 3.2。利用浏览器之间的区别,可以估计在最常见的用例下访问 Web 站点时 Web 站点的外观将如何变化。

Machine.config 中提到了大多数现代浏览器。如果某个浏览器在那里没有定义,那么您可以轻松地将定义添加到 Machine.config 或您应用程序的 Web.config 中。

定义新的浏览器


正如 Machine.config 中提到的几乎所有其他配置设置都可以扩展一样,浏览器的功能设置也可以扩展。假设有一个不为人知的浏览器,您需要为它量身定做站点的输出。为了支持新浏览器的功能,请在您的 Web.config 文件中建立一个单独的 <browserCaps>部分,如图 8 所示。

这用于告诉 ASP.NET 有一个名为“LameBrowser”的新浏览器。在 <browserCaps>部分中给出定义,这是一个支持背景音乐的下级浏览器。如果用户代理包含字符串“LameBrowser”,那么 ASP.NET 将用 Web.config 中提到的值来填充当前的 HttpBrowserCapabilities 对象。请注意,虽然匹配正则表达式是附加的,但应用程序层次结构中随后的进一步匹配将重写这些设置。

测试


如果您的测试环境中有目标浏览器的副本,那么就很容易明白您的 Web 站点将如何响应。如果没有,那么 ASP.NET 支持一种别名 (aliasing) 技术,该技术使您能够强制应用程序认为某个浏览器发出了请求。

您会在 Machine.config 中找到<clientTarget> 部分,它定义了 Internet Explorer 4.0 和 5.0 以及上级浏览器和下级浏览器的别名:

<clientTarget>
  <add alias="ie5" userAgent=
    "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 4.0)"/>
  <add alias="ie4" userAgent=
    "Mozilla/4.0 (compatible; MSIE 4.0; Windows NT 4.0)"/>
  <add alias="uplevel" userAgent=
    "Mozilla/4.0 (compatible; MSIE 4.0; Windows NT 4.0)"/>
  <add alias="downlevel" userAgent="Unknown"/>
</clientTarget>
 

如您所见,<clientTarget> 部分将简称映射为特定的用户代理字符串。如果您将页面的 ClientTarget 属性设置为所列出的任何别名,那么 ClientTargetSectionHandler 类将截获该别名,并使用特定的用户代理字符串来确定浏览器的功能。下面是一个在页面指令中设置 ClientTarget 的示例(您也可以在 Visual Studio 设计器中设置这个属性):

<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" 
    Inherits="BrowserCapabilitySite.WebForm1" clientTarget="uplevel"%>

这允许您显示在不同浏览器中呈现的页面。

创建自己的目标


虽然 ASP.NET 为您提供了四个内置目标别名,但您可能会从更多别名中受益。例如,假设您希望通过 Firefox 浏览器或前面提到的 LameBrowser 来测试您的站点。下面位于您的 Web.config 文件中的 XML 位将完成此任务(假设您对每个 <browserCaps>部分都进行了设置):

<system.web>
  <clientTarget>
    <add alias="firefox" userAgent="Mozilla/5.0 (Windows; U; 
      Windows NT 5.0; en-US; rv:1.6) Gecko/20040206 Firefox/0.8" />
    <add alias="lamebrowser" userAgent="LameBrowser"/>
 </clientTarget>
<system.web>
 

HtmlTextWriter 和 HtmlTextWriter32

除了图 5 中显示的属性之外,HttpBrowserCapabilities 还公开了另一个名为 TagWrite 的只读属性。TagWriter 属性公开类的类型,用于呈现控件中的标记。如果您曾经编写过自定义服务器端控件,那么您无疑已经见过传递给 Render 方法的 HtmlTextWriter 类。

您或许认为从服务器端控件调用 output.Write 与调用 Response.Write 相同,但实际上前者比后者更加灵活。HtmlTextWriter 包含有用于呈现特定 HTML 元素的方法。

虽然在编写自定义控件时包含其他 ASP.NET 服务器端控件通常会很好,但有时您需要手动处理标记。HtmlTextWriter 类包括的一些方法可以支持基于堆栈呈现标记和属性。

除了直接帮您保存开始和结束标记之外,HtmlTextWriter 还可以帮您发布 HTML 的正确版本。当 ASP.NET 获得请求时,它会检查 HttpBrowserCapabilities 类的 TagWriter 属性,并使用 HtmlTextWriter 或 Html32TextWriter(Html32TextWriter 派生于 HtmlTextWriter)。例如,在 HTML 3.2 与 HTML 4.0 中,表的呈现会略有不同。图 9 中的代码片段(显示服务器端控件中重写的 Render 方法)呈现了一个只有一行和一列的简单表。HtmlTextWriter 包含了基于浏览器所知的 HTML 版本呈现属性和标记的方法。

下面是 Html32TextWriter 呈现表的方式

<table width="30%" border="2">
  <tr>
    <td align="Right">
      <font color="red" size="5">
      Hi there...
      </font>
    </td>
  </tr>
</table>

而 HtmlTextWriter 类则按如下方式呈现表:

<table width="30%" border="2">
  <tr>
    <td align="Right" style="font-size:large;color:red;" >
    Hi there...
    </td>
  </tr>
</table>

请记住,Page 派生于 Control 类,并且您可以重写 Render 方法以便从 Page 访问 HtmlTextWriter。构建 ASP.NET 标准服务器端控件,以便根据发出请求的浏览器的功能进行呈现。

移动浏览器功能


到目前为止,我们只考虑了基本的浏览器功能。从 ASP.NET 1.1 开始,支持全套新的移动浏览器。遍历 ASP.NET 1.1 安装的整个 Machine.config 文件,它揭示了诸如 Windows® CE、Nokia、Ericsson 和 AvantGo 等设备和系统的设置。您会发现它们是内置在现代手机和 PDA 中的浏览器。

ASP.NET 用与一般浏览器完全相同的方法来确定这些功能。然而,当您审核各种不同的设备时,您会看到确定这些设备的浏览器功能会更加棘手,因为有更多的功能需要弄清楚。

确定设备的移动功能只是从普通设备功能的一种类型转换而已。也就是说,只需转换 MobileCapabilities 类的 Request.Browser 字段,您就可以检查设备功能(MobileCapabilities 派生于 HttpBrowserCapabilities)。图 10 中的代码确定了浏览器/设备(WML 或 HTML)标记语言的性质、用户屏幕的大小(以字符为单位)以及设备是否可以处理电子邮件。

当您查看 Machine.config 时,您会看到 75 个以上的移动设备功能(除了标准的浏览器功能之外)。设备的移动功能由 MobileDeviceCapabilitiesSectionHandler 配置处理程序决定。

小结


ASP.NET 提供了许多功能,可用于确定发出给定请求的客户端的功能。这为您提供了控制站点输出的手段,方法是将客户端目标的别名指定为应用程序中的特定用户代理字符串。


请将您的问题和意见发送到 asp-net@microsoft.com

George Shepherd 专门从事 .NET Framework 软件开发。他是 Programming with Microsoft Visual C++.NET (Microsoft Press, 2002) 一书的作者,并且与他人合著了 Applied .NET (Addison-Wesley, 2001) 一书。他是 Syncfusion 的一位在 Windows 窗体和 ASP.NET 工具方面很有贡献的架构师。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值