2012-05-13 60 views
6

我有一個可重複使用的HttpHandlers的問題。我想檢查IsReusable屬性如何工作。所以,我創建了兩個處理程序:的HttpHandler和IsReusable與WebHandler

可重複使用:

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

} 

他們預期這兩種工作方式:可重複使用的,每次遞增的回報價值,而不可再利用每返回0時間。但是當我使用我的處理程序作爲WebHandlers(* .ashx)時,它們每次都返回0(代碼完全相同)。這是否意味着當我使用WebHandlers IsReusable屬性被忽略?

回答

2

默認.NET配置是使用類型System.Web.UI.SimpleHandlerFactory來處理請求*.ashx。您可以通過查看IIS管理器中的Http Handlers部分來驗證這一點。

如果你看一下這個廠的源代碼,你可以看到,它不會在所有檢查IsReusable屬性。它也是無狀態的 - 它不會緩存創建的實例。要改爲查看使用此屬性的工廠類,請查看System.Web.Configuration.HandlerFactoryWrapper

現在,如果你看看System.Web.HttpApplication.RecycleHandlers(),你會發現它只是間接調用System.Web.IHttpHandlerFactory.ReleaseHandler()方法(在下一段中提到的工廠緩存本身沒有處理程序實例緩存)。應用程序本身會忽略IsReusable財產(工廠應該做的),併爲之前發現的.ashx文件使用一個工廠,不會重用的情況。

還值得一提的是System.Web.HttpApplication.GetFactory()似乎使用緩存,但該緩存將只保存工廠本身的實例(如果指定的話)。如果未指定明確的工廠,則該方法將創建上述的HandlerFactoryWrapper(這將輪流緩存處理程序實例)。

據我所見,在.NET框架中沒有工廠類,您可以使用而不是SimpleHandlerFactoryHandlerFactoryWrapper不具有無參數構造函數),但您可以創建自己的類。