从UserAgent字符串创建HttpBrowserCapabilitiesBase

csa*_*uve 8 .net c# http

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

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

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

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

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

maf*_*fue 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

去测试:

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