2012-05-13 1 views
6

재사용 가능한 HTTPHandlers에 문제가 있습니다. IsReusable 속성이 어떻게 작동하는지 확인하고 싶습니다. 재사용WebHandler를 사용하여 HTTPHandler 및 IsReusable

:

public class ReusableHandler : IHttpHandler 
{ 
    public bool IsReusable 
    { 
     get { return true; } 
    } 

    private int _counter; 

    public ReusableHandler() 
    { 
     _counter = 0; 
    } 

    public void ProcessRequest(HttpContext context) 
    { 
     context.Response.Write("Reusable: " + _counter++); 
    } 

} 

그리고 재사용하지 : 그래서 두 개의 핸들러를 만든

public class NonReusableHandler : IHttpHandler 
{ 
    public bool IsReusable 
    { 
     get { return false; } 
    } 

    private int _counter; 

    public NonReusableHandler() 
    { 
     _counter = 0; 
    } 

    public void ProcessRequest(HttpContext context) 
    { 
     context.Response.Write("NonReusable: " + _counter++); 
    } 

} 

그들은 예상대로 모두 일 : 재사용 할 때마다 반환 증가 값, NonReusable 0을 모든 반환하면서 시각. 그러나 Handler를 WebHandlers (* .ashx)로 사용할 때마다 매번 0을 반환합니다 (정확히 똑같은 코드). WebHandlers를 사용할 때 IsReusable 속성이 무시된다는 것을 의미합니까?

답변

2

*.ashx에 대한 요청을 처리하려면 System.Web.UI.SimpleHandlerFactory 유형을 사용하는 것이 기본 .NET 구성입니다. IIS 관리자에서 Http 처리기 섹션을 보면이를 확인할 수 있습니다.

이 팩토리의 소스 코드를 보면 IsReusable 속성을 전혀 확인하지 않은 것을 볼 수 있습니다. 또한 상태 비 저장 - 생성 된 인스턴스를 캐시하지 않습니다. 대신이 속성을 사용하는 팩토리 클래스를 보려면 System.Web.Configuration.HandlerFactoryWrapper을보십시오.

이제 System.Web.HttpApplication.RecycleHandlers()을 보면 간접적으로 System.Web.IHttpHandlerFactory.ReleaseHandler() 메서드가 호출된다는 것을 알 수 있습니다 (다음 단락에서 언급 한 기본 캐시는 처리기 인스턴스 캐싱을 자체적으로 수행하지 않습니다). 응용 프로그램 자체는 IsReusable 속성을 무시하고 (공장에서 수행해야 함) 이전에 발견 된 것처럼 .ashx 파일은 인스턴스를 다시 사용하지 않는 팩터 리를 사용합니다.

System.Web.HttpApplication.GetFactory()은 캐시를 사용하고있는 것처럼 보이지만 캐시는 지정된 경우에만 팩토리 자체의 인스턴스 만 저장합니다. 명시 적 팩토리가 지정되지 않은 경우 메서드는 위에서 언급 한 HandlerFactoryWrapper을 생성합니다 (차례대로 핸들러 인스턴스를 캐시합니다).

필자가 볼 수있는 한, SimpleHandlerFactory (HandlerFactoryWrapper에는 매개 변수없는 생성자가 없음) 대신 사용할 수있는 팩토리 클래스가 없습니다.