8

所以HttpRequestBase类有一个Browser 属性,它返回一个HttpBrowserCapabilitiesBase。我们目前在一些 MVC 基础架构代码中使用此属性来获取诸如浏览器名称和版本号(用于输出到日志)之类的内容。

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

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

我在想这个类可能只是解析 UserAgent 字符串,那么为什么没有 ctor(string) 呢?是否有我看不到的子类型、工厂或静态方法可以实现这一点?

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

4

1 回答 1

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);
于 2013-03-13T17:29:51.807 回答