2013-03-06 2 views
7

Таким образом, класс HttpRequestBase имеет Browser property, который возвращает HttpBrowserCapabilitiesBase. В настоящее время мы используем это свойство в некоторых из нашего кода инфраструктуры MVC, чтобы получить такие вещи, как имя и номер браузера (для вывода в журналы).Создание HttpBrowserCapabilitiesBase из строки UserAgent

У нас также есть api, который использует ServiceStack, и я хотел бы иметь возможность подключить его к нашей существующей инфраструктуре. Единственное, чего не хватает, - это разобрать имя и версию браузера из заголовка UserAgent (который я получил благодаря IHttpRequest.UserAgent), но вам нужен способ его разбора.

Мой вопрос: возможно ли создать HttpBrowserCapabilitiesBase с помощью только строки UserAgent? Единственным доступным подтипом, который я вижу в msdn, является HttpBrowserCapabilitiesWrapper, чей единственный ctor - это другой HttpBrowserCapabilitiesBase.

Я думал, что этот класс, вероятно, исключительно разбирает строку UserAgent, так почему же нет ctor (string)? Есть ли подтип, фабричный или статический метод, который я не вижу, что может это сделать?

Как правило, я просто делаю это для лености - я не хочу писать/находить другой парсер UserAgent, когда знаю .Net имеет такую ​​возможность, которую они просто скрывают.

+0

HttpBrowserCapabilitiesBase является абстрактным, так что вы не собираетесь быть в состоянии создать экземпляр вообще. – stuartd

+0

Да, но HttpBrowserCapabilitiesWrapper является единственным наследником на msdn, чей единственный ctor принимает другой HttpBrowserCapabilitiesWrapper. – csauve

+0

Должен быть конкретный, кроме обертки * где-то * .. – csauve

ответ

9

Я просто должен был сделать это сам. Вот что я пробовал. Он декомпилируется с 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); 
+0

спасибо, я дам вам попробовать – csauve

+0

Я думаю, что это решение вызовет исключение NullReferenceException в строке: factory.ConfigureBrowserCapabilities (headers, browserCaps); когда нет определения определения для useragent. Например, я использовал: «Mozilla/5.0 (совместимый MSIE 10.0, Windows Phone 8.0, Trident/6.0, IEMobile/10.0, ARM, Touch, NOKIA, Lumia 830) – nashwan

Смежные вопросы