asp.net-mvc - एएसपी एमवीसी:आईकंट्रोलर कब निपटान()कहा जाता है?




linq-to-sql garbage-collection idisposable (3)

मैं अपने बड़े एमवीसी ऐप्स में से एक के एक बड़े रिफैक्टरिंग / स्पीड ट्वीकिंग के माध्यम से जा रहा हूं। इसे अब कुछ महीनों के लिए उत्पादन में तैनात किया गया है, और मुझे कनेक्शन पूल में कनेक्शन के लिए टाइमआउट का इंतजार करना शुरू हो गया था। मैंने इस मुद्दे को उन कनेक्शनों पर ट्रैक किया है जो सही ढंग से निपटान नहीं कर रहे हैं।

इसके प्रकाश में, मैंने तब से अपने मूल नियंत्रक में यह परिवर्तन किया है:

public class MyBaseController : Controller
{
    private ConfigurationManager configManager;  // Manages the data context.

    public MyBaseController()
    {
         configManager = new ConfigurationManager();
    }

    protected override void Dispose(bool disposing)
    {
        if (disposing)
        {
            if (this.configManager != null)
            {
                this.configManager.Dispose();
                this.configManager = null;
            }
        }

        base.Dispose(disposing);
    }
}

अब, मेरे दो प्रश्न हैं:

  1. क्या मैं दौड़ की स्थिति पेश कर रहा हूं? चूंकि configManager DataContext प्रबंधन करता है जो IQueryable<> दृश्यों के पैरामीटर को उजागर करता है, मुझे यह सुनिश्चित करने की आवश्यकता है कि दृश्य को प्रस्तुत करने से पहले नियंत्रक पर Dispose() को नहीं कहा जाएगा।
  2. दृश्य के पहले या बाद में नियंत्रक पर एमवीसी फ्रेमवर्क कॉल Dispose() को प्रस्तुत किया जाता है? या, क्या एमवीसी फ्रेमवर्क कचरा कोलेक्टर तक छोड़ देता है?

Answers

क्रेग स्टंटज़ के उत्तर पर विस्तार करने के लिए:

जब नियंत्रक का निपटारा किया जाता है तो नियंत्रक फैक्ट्री संभालता है। IControllerFactory इंटरफेस को कार्यान्वित करते समय, कार्यान्वित करने की आवश्यकता वाले तरीकों में से एक रिलीज नियंत्रक है।

मुझे यकीन नहीं है कि आप किस नियंत्रक फैक्ट्री का उपयोग कर रहे हैं, भले ही आपने अपना खुद का लुत्फ उठाया हो, लेकिन रिफ्लेक्टर में डिफॉल्ट कंट्रोलर फैक्टरी को देखते हुए, रिलीज कंट्रोलर विधि इस प्रकार लागू की गई है:

public virtual void ReleaseController(IController controller)
{
    IDisposable disposable = controller as IDisposable;
    if (disposable != null)
    {
        disposable.Dispose();
    }
}

एक आईकंट्रोलर संदर्भ पारित किया जाता है, यदि वह नियंत्रक IDISposable लागू करता है, तो उस नियंत्रक विधि का निपटान विधि कहा जाता है। इसलिए, यदि आपके पास कुछ भी है, तो अनुरोध समाप्त होने के बाद आपको निपटान की आवश्यकता है, जो दृश्य के बाद किया जाता है। IDISposable को बंद करें और किसी भी संसाधन को जारी करने के लिए निपटान विधि में अपना तर्क डालें।

SystemCeb.Mvc.MvcHandler द्वारा रिलीज़ कंट्रोलर विधि को कॉल किया जाता है जो अनुरोध को संभालता है और यह IHttpHandler लागू करता है। ProcessRequest इसे दिए गए HttpContext को लेता है और कार्यान्वित नियंत्रक फैक्टरी में कॉल करके, अनुरोध को संभालने के लिए नियंत्रक को खोजने की प्रक्रिया शुरू करता है। यदि आप ProcessRequest विधि में देखते हैं तो आपको अंततः ब्लॉक दिखाई देगा जो नियंत्रक फैक्टरी के रिलीज नियंत्रक को कॉल करता है। यह केवल तब कहा जाता है जब नियंत्रक ने ViewResult वापस कर दिया है।


व्यू को हमेशा प्रस्तुत किए जाने के बाद बुलाया जाता है।

दृश्य को ActionResult.ExecuteResult कॉल में प्रस्तुत किया जाता है। इसे ControllerActionInvoker.InvokeAction द्वारा (अप्रत्यक्ष रूप से) कहा जाता है, जिसे बदले में ControllerBase.ExecuteCore द्वारा बुलाया जाता है।

चूंकि दृश्य प्रस्तुत किए जाने पर नियंत्रक कॉल स्टैक में होता है, तब इसे डिस्पोजेड नहीं किया जा सकता है।


आपको System.Web.Http.Authorize उपयोग करना होगा। एक ApiController (वेब एपीआई नियंत्रक) और System.Web.Mvc.Authorize खिलाफ ApiController एक Controller (एमवीसी नियंत्रक) के खिलाफ ApiController । चूंकि ढांचा पाइपलाइन प्रसंस्करण के हिस्से के रूप में फ़िल्टर चलाता है और नियंत्रकों को सही फ़िल्टर लागू करने की उम्मीद है, यदि आप संबंधित फ़िल्टर का उपयोग नहीं करते हैं, तो प्राधिकरण काम नहीं करेगा।





asp.net-mvc linq-to-sql garbage-collection idisposable