在此示例代码中,创建了一个新的HttpBrowserCapabilities对象,仅指定了命名为browser的能力并设置此能力为MyCustomBrowser。
2. 在应用程序中注册提供程序。
为了在一个应用程序中使用一个提供程序,您必须把provider属性添加到Web.config或Machine.config文件中的browserCaps节。(您也可以在一个应用程序的特定目录的一个位置元素中定义provider属性,例如在一个针对特定的移动设备的文件夹下。)下面的示例显示了如何在一个配置文件中设置provider属性:
<browserCaps provider="ClassLibrary2.CustomProvider, ClassLibrary2,
Version=1.0.0.0, Culture=neutral" />
</system.web>
另一个注册新的浏览器能力定义的途径是使用代码,如以下示例所示:
{
HttpCapabilitiesBase.BrowserCapabilitiesProvider =
new ClassLibrary2.CustomProvider();
// ...
}
此代码必须运行在Global.asax文件的Application_Start事件中。任何对BrowserCapabilitiesProvider类的改变必须在应用程序执行任何代码之前发生,以确保缓存处于针对解析的HttpCapabilitiesBase对象的一个有效的状态。
(二)缓存HttpBrowserCapabilities对象
前面的例子中有一个问题,就是每当调用这个自定义提供程序以获得HttpBrowserCapabilities对象时该代码都将运行。因此,这在每个请求期间都可能发生多次。在这个例子中,自定义提供程序并没有实现什么功能。但是,如果在您的自定义提供程序代码中要执行重要的工作以便获得HttpBrowserCapabilities对象,那么,这有可能会导致巨大的开销。为了防止这种情况发生,你可以缓存HttpBrowserCapabilities对象。为此,请按照下列步骤操作:
1. 从HttpCapabilitiesProvider类创建一个派生类,如下面的例子所示:
{
public override HttpBrowserCapabilities
GetBrowserCapabilities(HttpRequest request)
{
string cacheKey = BuildCacheKey();
int cacheTime = GetCacheTime();
HttpBrowserCapabilities browserCaps =
HttpContext.Current.Cache[cacheKey] as
HttpBrowserCapabilities;
if (browserCaps == null)
{
HttpBrowserCapabilities browserCaps = new
HttpBrowserCapabilities();
Hashtable values = new Hashtable(180,
StringComparer.OrdinalIgnoreCase);
values[String.Empty] = request.UserAgent;
values["browser"] = "MyCustomBrowser";
browserCaps.Capabilities = values;
HttpContext.Current.Cache.Insert(cacheKey,
browserCaps, null, DateTime.MaxValue,
TimeSpan.FromSeconds(cacheTime));
}
return browserCaps;
}
}