从UserAgent字符串创建HttpBrowserCapabilitiesBase

时间:2013-03-06 17:12:33

标签: c# .net http

因此HttpRequestBase类的Browser property返回HttpBrowserCapabilitiesBase。我们目前在一些MVC基础设施代码中使用此属性来获取浏览器名称和版本号(输出到日志)。

我们还有一个使用ServiceStack的api,我希望能够将其挂钩到我们现有的基础架构中。唯一缺少的是能够解析UserAgent标题中的浏览器名称和版本(我感谢IHttpRequest.UserAgent),但需要一种方法来解析它。

我的问题 - 是否可以仅使用UserAgent字符串以某种方式创建HttpBrowserCapabilitiesBase?我在msdn上看到的唯一可用子类型是HttpBrowserCapabilitiesWrapper,其唯一的ctor是另一个HttpBrowserCapabilitiesBase。

我在想这个类可能只是解析UserAgent字符串,所以为什么没有ctor(字符串)?是否存在可以实现此目的的子类型,工厂或静态方法?

一般来说,我只是为了懒惰而这样做 - 当我知道.Net有这种能力他们只是隐藏它时,我不想写/找到另一个UserAgent解析器。

1 个答案:

答案 0 :(得分:10)

我必须自己做这件事。这是我尝试过的。它是从System.Web反编译的,但仍然依赖于该库。我还在测试它,但也许它可以帮助你:

public class BrowserCapabilities
{

    public static HttpBrowserCapabilities 
        GetHttpBrowserCapabilities(NameValueCollection headers, string userAgent)
    {
        var factory = new BrowserCapabilitiesFactory();
        var browserCaps = new HttpBrowserCapabilities();
        var hashtable = new Hashtable(180, StringComparer.OrdinalIgnoreCase);
        hashtable[string.Empty] = userAgent;
        browserCaps.Capabilities = hashtable;
        factory.ConfigureBrowserCapabilities(headers, browserCaps);
        factory.ConfigureCustomCapabilities(headers, browserCaps);
        return browserCaps;
    }
}

测试:

var features = BrowserCapabilities.GetHttpBrowserCapabilities(null, 
    "Mozilla/4.0    (compatible; MSIE 7.0; Windows NT 6.0)");
Console.WriteLine(features.Browser);