2013-03-06 8 views
7

Tak więc klasa ma wartość Browser property, która zwraca wartość HttpBrowserCapabilitiesBase. Obecnie używamy tej właściwości w niektórych z naszych kodów infrastruktury MVC, aby uzyskać takie informacje jak nazwa przeglądarki i numer wersji (dla danych wyjściowych do dzienników).Tworzenie klasy HttpBrowserCapabilities z ciągu UserAgent

Mamy również api, który używa ServiceStack, i chciałbym móc podłączyć go do naszej istniejącej infrastruktury. Jedyne czego brakuje to to, że można przetworzyć nazwę i wersję przeglądarki z nagłówka UserAgent (co mam dzięki IHttpRequest.UserAgent), ale potrzebuję sposobu na przeanalizowanie go.

Moje pytanie - czy jest możliwe stworzenie HttpBrowserCapabilitiesBase jakoś tylko z ciągu identyfikującego? Jedynym dostępnym podtypem widzianym na msdn jest HttpBrowserCapabilitiesWrapper, którego jedynym ctorkiem jest inna HttpBrowserCapabilitiesBase.

Myślałam, że ta klasa prawdopodobnie wyłącznie analizuje ciągu identyfikującego jakikolwiek, więc dlaczego nie ma konstruktor (string) ?? Czy istnieje podtyp, fabryka lub statyczna metoda, której nie widzę, aby to osiągnąć?

Generalnie robię to po prostu dla lenistwa - nie chcę pisać/znajduję innego parsera UserAgent, gdy wiem. Net ma taką możliwość, że go po prostu ukrywają.

+0

HttpBrowserCapabilitiesBase jest abstrakcyjna, więc nie będziemy w stanie utworzyć wystąpienie w ogóle. – stuartd

+0

Tak, ale HttpBrowserCapabilitiesWrapper jest jedynym spadkobiercą w msdn, którego jedyny ctor pobiera inny HttpBrowserCapabilitiesWrapper. – csauve

+0

Musi istnieć konkret inny niż opakowanie * gdzieś * .. – csauve

Odpowiedz

9

Po prostu musiałem to zrobić sam. Oto, co próbowałem. Jest dekompilowany od System.Web, ale nadal jest zależny od tej biblioteki. Ja wciąż testuje go, ale może to pomaga:

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; 
    } 
} 

przetestować:

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

dziękuję, dam ci spróbować – csauve

+0

Myślę, że to rozwiązanie rzuci wyjątek NullReferenceException na linii: factory.ConfigureBrowserCapabilities (nagłówki, browserCaps); gdy nie ma znalezionej definicji dla użytkownika. Na przykład użyłem: "Mozilla/5.0 (zgodny, MSIE 10.0, Windows Phone 8.0, Trident/6.0, IEMobile/10.0; ARM; Touch; NOKIA; Lumia 830)" – nashwan