从UserAgent字符串创建HttpBrowserCapabilitiesBase

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

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

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

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

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

我必须自己做这件事。 这是我尝试过的。 它是从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);