技术开发 频道

ASP.NET4与VS 2010Web开发之窗体改进

  在此示例代码中,创建了一个新的HttpBrowserCapabilities对象,仅指定了命名为browser的能力并设置此能力为MyCustomBrowser。

  2. 在应用程序中注册提供程序。

  为了在一个应用程序中使用一个提供程序,您必须把provider属性添加到Web.config或Machine.config文件中的browserCaps节。(您也可以在一个应用程序的特定目录的一个位置元素中定义provider属性,例如在一个针对特定的移动设备的文件夹下。)下面的示例显示了如何在一个配置文件中设置provider属性:

<system.web>
<browserCaps provider="ClassLibrary2.CustomProvider, ClassLibrary2,
  Version=1.0.0.0, Culture=neutral" />
</system.web>

   另一个注册新的浏览器能力定义的途径是使用代码,如以下示例所示:

void Application_Start(object sender, EventArgs e)

  {

  HttpCapabilitiesBase.BrowserCapabilitiesProvider
=

  
new ClassLibrary2.CustomProvider();

  
// ...

  }

  此代码必须运行在Global.asax文件的Application_Start事件中。任何对BrowserCapabilitiesProvider类的改变必须在应用程序执行任何代码之前发生,以确保缓存处于针对解析的HttpCapabilitiesBase对象的一个有效的状态。

  (二)缓存HttpBrowserCapabilities对象

  前面的例子中有一个问题,就是每当调用这个自定义提供程序以获得HttpBrowserCapabilities对象时该代码都将运行。因此,这在每个请求期间都可能发生多次。在这个例子中,自定义提供程序并没有实现什么功能。但是,如果在您的自定义提供程序代码中要执行重要的工作以便获得HttpBrowserCapabilities对象,那么,这有可能会导致巨大的开销。为了防止这种情况发生,你可以缓存HttpBrowserCapabilities对象。为此,请按照下列步骤操作:

  1. 从HttpCapabilitiesProvider类创建一个派生类,如下面的例子所示:

public class CustomProvider : 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;
  }
}
0
相关文章