2012-09-02 10 views
5

मेरे पास एक IHttpHandler है जो मुझे विश्वास है कि पुनः उपयोग से लाभ हो सकता है, क्योंकि यह स्थापित करने के लिए महंगा है, और थ्रेड-सुरक्षित है। लेकिन प्रत्येक अनुरोध के लिए एक नया हैंडलर बनाया जा रहा है। मेरे हैंडलर का पुन: उपयोग नहीं किया जा रहा है।IHttpHandler IsReusable, लेकिन पुनः उपयोग नहीं किया जा रहा है

महंगा सेटअप के बिना, मेरा सरल परीक्षण केस निम्नलिखित है। यह सरल मामला मेरी समस्या का प्रदर्शन करता है:

public class MyRequestHandler : IHttpHandler 
{ 
    int nRequestsProcessed = 0; 

    public bool IsReusable 
    { 
     get { return true; } 
    } 

    public void ProcessRequest(HttpContext context) 
    { 
     nRequestsProcessed += 1; 
     Debug.WriteLine("Requests processed by this handler: " + nRequestsProcessed); 
     context.Response.ContentType = "text/plain"; 
     context.Response.Write("Hello World"); 
    } 
} 

Requests processed by this handler: 1 
Requests processed by this handler: 1 
Requests processed by this handler: 1 
Requests processed by this handler: 1... at least 100 times. I never see > 1. 

क्या मैं गलत समझ रहा हूं कि कैसे उपयोग किया जा सकता है? क्या ऐसा कुछ और है जो पुनः उपयोग को पराजित कर सकता है? मेरे हैंडलर को सिल्वरलाइट एप्लिकेशन से बुलाया जा रहा है अगर इससे कोई फर्क पड़ता है।

+0

कैसे आप अपने आवेदन करने के लिए अपने हैंडलर संलग्न कर रहे हैं? Web.config या प्रोग्रामेटिक के माध्यम से? – Jacob

+0

यह मेरा पहला ऐसा ऐप है। मैंने विजुअल स्टूडियो में एक नया एएसपी.नेट वेब साइट प्रोजेक्ट बनाया है। सर्वर चलाने के लिए, मैं विजुअल स्टूडियो से डीबग चला रहा हूं। –

+0

मैं पूछ रहा हूं कि आपने चलाने के लिए 'MyRequestHandler' को कैसे कॉन्फ़िगर किया है। उदाहरण के लिए, क्या यह आपके web.config में कॉन्फ़िगर किया गया है, या क्या आपके पास 'Global.asax' में कोड है जो इसे पंजीकृत करता है? – Jacob

उत्तर

3

IsReusable गारंटी नहीं है।

बस अपने हैंडलर को दोबारा दोहराएं और सभी क्रॉस-अनुरोध राज्य को एक अलग वर्ग में रखें। में वेब अनुप्रयोग में क्रॉस-अनुरोध स्थिति को स्पष्ट रूप से अलग करना सबसे अच्छा अभ्यास है क्योंकि यह खतरनाक है।

+0

मेरा महंगा सेटअप 100 एमबी मेमोरी आवंटित करना शामिल है, और मान लें कि इसे किसी भी बेहतर तरीके से डिज़ाइन नहीं किया जा सकता है, इसलिए आवंटन अपरिहार्य है। मैं प्रत्येक अनुरोध के लिए 100 एमबी आवंटित नहीं करना चाहता हूं। मेमोरी पॉइंटर को बनाए रखने के लिए मैं "अलग-अलग वर्ग" का उपयोग कैसे कर सकता हूं, इसलिए इसे एकाधिक अनुरोधों (या एकाधिक हैंडलर) द्वारा एक्सेस किया जा सकता है? –

+0

बस अपने राज्य-होल्डिंग क्लास के उदाहरण के लिए इंगित एक स्थिर चर का उपयोग करें। या इसे http अनुप्रयोग शब्दकोश में डाल दें। किसी भी प्रकार का स्थिर भंडारण करेगा (सुनिश्चित करें कि थ्रेड-सुरक्षित होना चाहिए, बीटीडब्ल्यू)। – usr

+1

अच्छा जवाब। धन्यवाद। –

1

यदि यह थ्रेड-सुरक्षित है, तो आप वैसे भी पुन: उपयोग करने से बेहतर हो सकते हैं।

जब IsReusable रिटर्न तो सच:

  1. पहले हैंडलर का एक उदाहरण बन जाता है।
  2. यह ProcessRequest कहा जाता है।
  3. यह को फिर से उपयोग करने के लिए पूल में रखा जा सकता है।

इसका मतलब यह है कि यह बार-बार सेट अप लागत को कम कर सकता है, लेकिन जरूरी नहीं कि (कोई गारंटी नहीं है) और पूरी तरह से नहीं - अगर वहाँ उसी URI करने के लिए कई समवर्ती कॉल कर रहे हैं, तो अन्य कई तरह के संचालकों की आवश्यकता होगी एक ही समय में उन्हें संभालने के लिए बनाया गया।

इस दृष्टिकोण के बारे में अच्छी बात यह है कि (जब पूलिंग होती है), हैंडलर को वास्तव में थ्रेड-सुरक्षित नहीं होना चाहिए।

चूंकि आपका यद्यपि है, हम दो तरीकों से बेहतर तरीके से कर सकते हैं।

एक, आपकी सभी कार्यक्षमताओं को किसी अन्य वर्ग में रखना है। फिर हैंडलर सिर्फ एक पतली कक्षा हो सकती है जहां ProcessRequest उस के एक स्थिर उदाहरण के माध्यम से गुजरता है।

इसी तरह, हम अपने वर्तमान वर्ग एक IHttpHandlerFactory का उपयोग कर के साथ ऐसा कर सकते हैं:

public class MyRequestHandlerFactory : IHttpHandlerFactory 
{ 
    private static MyRequestHandler SingletonHandler = new MyRequestHandler(); 
    IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated) 
    { 
    return SingletonHandler; 
    } 
    void ReleaseHandler(IHttpHandler handler) 
    { 
    //do nothing 
    } 
} 
ऊपर वर्ग के साथ

, तो आप सिर्फ MyRequestHandlerFactory का उल्लेख करने के जहां यह वर्तमान में MyRequestHandler को संदर्भित करता है Web.Config बदल सकते हैं, और यह पूरी तरह से काम करेगा।

(जब तक आप धागे की सुरक्षित रूप वास्तव में नहीं कर रहे हैं के रूप में आप सोचा, जिस स्थिति में - oopsie)

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