2013-03-06 2 views
7

HttpRequestBase 클래스는 Browser property이고 HttpBrowserCapabilitiesBase을 반환합니다. 현재 MVC 인프라 코드 일부에서이 속성을 사용하여 브라우저 이름 및 버전 번호 (로그 출력)를 가져옵니다.UserAgent 문자열에서 HttpBrowserCapabilitiesBase 만들기

우리는 또한 ServiceStack을 사용하는 API를 가지고 있으며, 이것을 기존 인프라에 연결하고 싶습니다. 누락 된 유일한 것은 UserAgent 헤더 (IHttpRequest.UserAgent 덕분에)에서 브라우저 이름과 버전을 구문 분석 할 수 있지만이를 구문 분석 할 방법이 필요합니다.

내 질문 - 어떻게 그냥 UserAgent 문자열로 HttpBrowserCapabilitiesBase를 만들 수 있습니까? 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); 사용자 에이전트에 대한 정의가 발견되지 않은 경우. 예를 들어 "Mozilla/5.0 (MSIE 10.0, Windows Phone 8.0, Trident/6.0, IEMobile/10.0, ARM, Touch, NOKIA, Lumia 830)"을 사용했습니다. – nashwan