Caching the HttpBrowserCapabilities Object

  앞의 예는 한가지 문제점을 가지고 있습니다. 그것은 그 코드가 동작할 때마다,  HttpBrowserCapabilities  객체를 얻기위하여 커스텀 공급자가 인보크 되어야 하는 것입니다. 이것은 각 요청들 동안 복합적인 시간이 발생합니다. 예를들어, 보통 공급자를 위한 코드는 많이 발생하지 않습니다. 그러나 당신의 커스텀 공급자 안의 코드가 HttpBrowserCapabilities  객체를 얻기위하여 중요한 작업을 수행한다면, 이것은 큰 오버헤드를 초래할 수 있습니다:

이러한 것을 예방하기위해서 당신은 HttpBrowserCapabilities 객체를 캐쉬 할 수 있습니다. 다음을 보세요.

  1. Create a class that derives from HttpCapabilitiesProvider, like the one in the following example: HttpCapabilitiesProvider 를 상속 받기 위한 클래스를 창조하세요. 다음의 예가 있어요.   
public class CustomProvider : HttpCapabilitiesProvider { public override HttpBrowserCapabilities GetBrowserCapabilities(HttpRequest request) { string cacheKey = BuildCacheKey(); int cacheTime = GetCacheTime(); HttpBrowserCapabilities browserCaps = HttpContext.Current.Cache[cacheKey] as HttpBrowserCapabilities; if (browserCaps == null) { HttpBrowserCapabilities browserCaps = new HttpBrowserCapabilities(); Hashtable values = new Hashtable(180, StringComparer.OrdinalIgnoreCase); values[String.Empty] = request.UserAgent; values["browser"] = "MyCustomBrowser"; browserCaps.Capabilities = values; HttpContext.Current.Cache.Insert(cacheKey, browserCaps, null, DateTime.MaxValue, TimeSpan.FromSeconds(cacheTime)); } return browserCaps; } }

  예를 보면, 코드는  커스텀 BuildCacheKey 매소드를 부르는 것에 의하여 캐쉬키를 발생합니다. 그리고 그것은 커스텀 GetCacheTime 매소드를 부르는 것에 의하여 캐쉬에 걸린 시간을 얻습니다. 그 다음에 코드는 캐쉬에서 결정된 HttpBrowserCapabilities 객체를 더합니다. 객체는 캐쉬로부터 찾아 질 수 있고, 당신의 커스텀 공급자를 필요로하는 하부 요청시 재사용됩니다.

  1. 앞의 예제에서 설명되었듯이 어플리케이션과 함께 공급자를 등록합니다.

Extending ASP.NET Browser Capabilities Functionality

이전의 섹션은 ASP.NET 4에서의 새로운 HttpBrowserCapabilities  객체를 생성하는 법을 설명했습니다. 당신은 또한 ASP.NET 4 브라우저의 성능, 기능성을 향상 시킬 수 있습니다. 그 방법은 새로운 브라우저의 성능이 ASP.NET에 이미 있는 그것들을 정의한 것을 덧붙이는 것입니다.

당신은 XML브라우저 정의들을 사용하는 것 없이 이것을 할 수 있습니다. 다음의 프로시저는 그 방법을 보여줍니다.

  1. Create a class that derives from HttpCapabilitiesEvaluator and that overrides the GetBrowserCapabilities method, like the one in the following example: HttpCapabilitiesEvaluator 부터 상속 받고, GetBrowserCapabilities 매소드를 오버라이드하여 클래스를 생성합니다. 다음의 예를 보세요.
public class CustomProvider : HttpCapabilitiesEvaluator
        {
          public override HttpBrowserCapabilities
            GetBrowserCapabilities(HttpRequest request)
            {
              HttpBrowserCapabilities browserCaps =
                base.GetHttpBrowserCapabilities(request);
              if (browserCaps.Browser == "Unknown")
              {
                browserCaps = MyBrowserCapabilitiesEvaulator(request);
              }
            return browserCaps;
          }
        }

먼저 이 코드는 브라우저를 확인하기 위한 ASP.NET 브라우저의 성능 기능을 사용합니다. 그러나, 브라우저가 확인 되지 않는다면, 리퀘스트에 정의된 정보를 통하여 확인합니다. (즉,  HttpBrowserCapabilities  객체의 Browser 속성이 스트링형의 "Unknown" 이라면) 코드는 브라우저를 확인하기 위하여 커스텀 공급자인 MyBrowserCapabilitiesEvaluator를 호출합니다.

  1.  앞의 예제에서 설명되었듯이 어플리케이션과 함께 공급자를 등록합니다.

 

Extending Browser Capabilities Functionality by Adding New Capabilities to Existing Capabilities Definitions

  커스텀 브라우저 정의 공급자를 창조하는 것과 동적으로 새로운 브라우저 정의를 창조하는 것에 추가적으로, 당신은 추가적인 성능과 함께 존재하는 브라우저 정의를 확장 할 수 있습니다. 이것은 당신이 당신이 원했던 것과 가깝지만 단지 약간의 기능이 부족한 정의를 사용 하게 합니다. 이것을 하기위하여, 다음의 단계를 따르세요.

  1. 객체를 상속받고, GetBrowserCapabilities 매소드를 오버라이드하는 클래스를 생성합니다. 다음 예를 보세요.



    public class CustomProvider : HttpCapabilitiesEvaluator
            {
              public override HttpBrowserCapabilities
                GetBrowserCapabilities(HttpRequest request)
              {
                HttpBrowserCapabilities browserCaps =
                  base.GetHttpBrowserCapabilities(request);
                if (browserCaps.Browser == "Unknown")
                {
                  browserCaps = MyBrowserCapabilitiesEvaulator(request);
                }
                return browserCaps;
              }
            }
      예제 코드는 존재하는 ASP.NET HttpCapabilitiesEvaluator 클래스를 확장하고, 다음 코드를 사용하는 
  2. 것에 의하여 현재 요청 정의와 일치 했는지를 HttpBrowserCapabilities 객체로 얻습니다.   
            HttpBrowserCapabilities browserCaps =
              base.GetHttpBrowserCapabilities(request);


    코드는 이 브라우저를 위한 성능을 더하거나 수정할 수 있습니다. 새로운 브라우저 성능을 상세화하기 위한 두 가지 방법이 있습니다.

  • 객체에 키와 값을 쌍으로 덧붙입니다. 그리고 그것에  Capabilities  속성과 HttpCapabilitiesBase 객체에 의하여 노출 시킵니다.  앞의 예제에서, 코드는 값을 true로 하여 MultiTouch 불리는 성능을 덧붙입니다.

  • 객체의 존재하는 속성을 설정합니다. 앞의 예제에서 코드는  Frames 속성을 true로 설정합니다이 속성은 간단하게 IDictionary 객체를 위한 접근자입니다. IDictionary  객체는 Capabilities 속성에 의하여 노출 되었습니다.

Note: 컨트롤 어뎁터를 포함하면서, 이 모델은 HttpBrowserCapabilities 의 속성에 적용합니다.

  1. 앞의 프로시저에서 설명 되었듯이 어플리케이션과 함께 공급자를 등록합니다.