2013-03-06 16 views
7

HttpRequestBase sınıfında HttpBrowserCapabilitiesBase döndüren Browser property sınıfı vardır. Şu anda bu özelliği, tarayıcı adı ve sürüm numarası (kütüklere çıktı için) gibi şeyleri almak için MVC altyapımızın bir kısmında kullanıyoruz.Bir UserAgent dizesinden bir HttpBrowserCapabilitiesBase oluşturma

Ayrıca, ServiceStack'u kullanan bir api'miz var ve bunu mevcut altyapımıza takabilmek istiyorum. Eksik olan tek şey, tarayıcı adını ve sürümünü UserAgent başlığından (IHttpRequest.UserAgent'a teşekkürler) ayrıştırmaktır, ancak ayrıştırmanın bir yoluna ihtiyaç duyar.

Soruma Bir HttpBrowserCapabilitiesBase'i bir UserAgent dizesiyle bir şekilde oluşturmak mümkün mü? Msdn'de görebildiğim tek alt türü, tek bir başka HttpBrowserCapabilitiesBase olan HttpBrowserCapabilitiesWrapper'dur.

Bu sınıfın muhtemelen yalnızca UserAgent dizesini ayrıştırdığını düşünüyordum, o halde neden bir ctor (string) yok? Bunu gerçekleştirebilecek bir alt tip, fabrika veya statik yöntem var mı?

Genellikle bunu tembellik için yapıyorum - Bildiğimde başka bir UserAgent ayrıştırıcısı yazmak/bulmak istemiyorum. Net bu yetenekleri sadece gizliyor.

+0

HttpBrowserCapabilitiesBase yüzden hiç bir örneğini oluşturmak mümkün olacak değiliz soyut. – stuartd

+0

Evet, ancak HttpBrowserCapabilitiesWrapper, tek ctor başka bir HttpBrowserCapabilitiesWrapper alan msdn üzerindeki tek mirastır. – csauve

+0

Sarmalayıcıdan başka bir yerde beton * olmalı *. – csauve

cevap

9

Sadece bunu kendim yapmak zorundaydım. İşte denedim. System.Web'dan decompiled, ancak hala bu kütüphaneye bağımlı. Hala test ediyorum, ama belki bu size yardımcı olur:

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

testi için:

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

teşekkürler, bunu bir deneyin vereceğim – csauve

+0

Bu çözümde bir NullReferenceException atar düşünüyorum: factory.ConfigureBrowserCapabilities (headers, browserCaps); Kullanışlı tanım için tanım bulunamadığı zaman. Örneğin ben kullandım: "Mozilla/5.0 (uyumlu; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 830)" – nashwan

İlgili konular