2012-05-13 8 views
6

मुझे पुन: प्रयोज्य HTTPHandlers के साथ समस्या है। मैं जांचना चाहता था कि IsReusable संपत्ति का काम कैसे करता है।HTTPHandler और WebHandler के साथ 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 हर पहर। लेकिन जब मैं अपने हैंडलर को वेबहैंडलर (* .ashx) के रूप में उपयोग करता हूं तो वे दोनों हर बार 0 लौटते हैं (कोड बिल्कुल वही)। क्या इसका मतलब यह है कि जब मैं WebHandlers का उपयोग करता हूं तो IsReusable संपत्ति को अनदेखा किया जाता है?

उत्तर

2

डिफ़ॉल्ट .NET कॉन्फ़िगरेशन के अनुरोधों को संभालने के लिए System.Web.UI.SimpleHandlerFactory प्रकार का उपयोग करना है। आप आईआईएस प्रबंधक में एचटीपी हैंडलर सेक्शन देखकर इसे सत्यापित कर सकते हैं।

यदि आप इस कारखाने के लिए स्रोत कोड देखते हैं, तो आप देख सकते हैं कि यह IsReusable संपत्ति की जांच नहीं करता है। यह स्टेटलेस भी है - यह बनाए गए उदाहरणों को कैश नहीं करता है। इस संपत्ति का उपयोग कर रहे फैक्ट्री क्लास को देखने के लिए, System.Web.Configuration.HandlerFactoryWrapper देखें।

अब यदि आप System.Web.HttpApplication.RecycleHandlers() देखते हैं तो आप देखते हैं कि यह केवल अप्रत्यक्ष रूप से System.Web.IHttpHandlerFactory.ReleaseHandler() विधि (अगले अनुच्छेद में वर्णित फैक्ट्री कैश को अपने आप पर कोई हैंडलर इंस्टेंस कैशिंग नहीं है)। एप्लिकेशन स्वयं IsReusable संपत्ति (कारखाने को ऐसा करने वाला माना जाता है) को अनदेखा करता है और जैसा कि पहले पाया गया था, .ashx फ़ाइलें ऐसे कारखाने का उपयोग करती हैं जो उदाहरणों का पुन: उपयोग नहीं करती है।

यह भी ध्यान देने योग्य है कि System.Web.HttpApplication.GetFactory() कैश का उपयोग कर रहा है लेकिन वह कैश केवल फैक्ट्री के उदाहरण को स्टोर करेगा (यदि यह निर्दिष्ट है)। यदि एक स्पष्ट कारखाना निर्दिष्ट नहीं है, तो विधि उपरोक्त वर्णित HandlerFactoryWrapper (जो बदले में हैंडलर उदाहरणों को कैश करेगा) बनायेगी।

जहाँ तक मैं देख सकता हूं, वहां SimpleHandlerFactory (HandlerFactoryWrapper के बजाय पैरामीटर रहित कन्स्ट्रक्टर नहीं है) के बजाय आप .NET फ्रेमवर्क में कोई फ़ैक्टरी क्लास नहीं उपयोग कर सकते हैं, हालांकि आप अपना स्वयं का बना सकते हैं।

संबंधित मुद्दे