2012-05-25 11 views
7

यह एक Asp.net आवेदन (नहीं MVC) नेट 3.5Asp.Net (नहीं MVC) में Autofac साथ HttpContextBase रजिस्टर करने के लिए कैसे

मैं इस लगाया है:

protected void Application_Start(object sender, EventArgs e) 
{ 

... 

     builder.Register(c => new HttpContextWrapper(HttpContext.Current)) 
      .As<HttpContextBase>() 
      .InstancePerHttpRequest(); 
} 

लेकिन यह नहीं करता है काम नहीं करता

त्रुटि मैं इस हो रही है:

एक टैग मिलान 'HttpRequest' के साथ कोई गुंजाइश गुंजाइश है, जिसमें उदाहरण अनुरोध किया गया था से दिख रहा है। यह आम तौर पर इंगित करता है कि प्रति-HTTP अनुरोध के रूप में पंजीकृत एक घटक को सिंगलइंस्टेंस() घटक (या एक समान परिदृश्य) द्वारा पुनः प्राप्त किया जा रहा है। वेब एकीकरण के तहत हमेशा निर्भरता रिसेल्वर से वर्तमान निर्भरता का अनुरोध करें। वर्तमान या ILifetimeScopeProvider.RequestLifetime, कंटेनर से कभी नहीं ।

तो फिर मैं इस पाया: https://stackoverflow.com/a/7821781/305469

और मैं इस के बजाय किया:

public class HttpService : IHttpService 
{ 
    private readonly HttpContextBase context; 

    public HttpService(HttpContextBase context) 
    { 
     this.context = context; 
    } 

    public void ResponseRedirect(string url) 
    { 
     //Throws null ref exception 
     context.Response.Redirect(url); 
    } 
} 

और मैं एक अशक्त संदर्भ अपवाद है:

 builder.Register(c => new HttpContextWrapper(HttpContext.Current)) 
      .As<HttpContextBase>() 
      .InstancePerLifetimeScope(); 

लेकिन अब जब मैं यह कर ।

आश्चर्यजनक रूप से, संदर्भ। प्रतिक्रिया शून्य नहीं है, यह तब होता है जब मैं इसे निर्देशित करता हूं। रेडियोधर्मी() जो इसे फेंक देता है।

मैं सोच रहा हूं कि .InstancePerLifetimeScope(); समस्या यह है।

बीटीडब्ल्यू, मैंने Response.Redirect() का उपयोग करने की कोशिश की और यह पूरी तरह से काम करता है।

तो समस्या क्या हो सकती है?

धन्यवाद,

ची

+1

'InstancePerHttpRequest' के साथ आपके पहले उदाहरण में इसका क्या अर्थ है: काम नहीं करता है? अपवाद आदि? और आप अपनी 'HttpService' को कैसे हल करते हैं या यह कैसे पंजीकृत है? जब आपने नल रेफरी अपवाद का जिक्र किया तो पूर्ण स्टैकट्रैक क्या है? – nemesv

+0

जैसा कि नेमेसेव ने कहा था, क्यों नहीं .InstancePerHttpRequest() संस्करण काम करता है? – codeulike

+0

धन्यवाद दोस्तों, मैंने उस त्रुटि को शामिल करने के लिए प्रश्न अपडेट किया है जब मैं उपयोग करता हूं .InstancePerHttpRequest() –

उत्तर

4

ऐसा लगता है कि आपकी HttpService कक्षा SingleInstance() (सिंगलटन) घटक के रूप में पंजीकृत हो सकती है। या, उन वर्गों में से एक जो IHttpService निर्भरता के रूप में एक सिंगलटन है।

जब ऐसा होता है, तो आप HTTP अनुरोध (या जीवन भर गुंजाइश है, जो भी सही है) प्रति एक नया HttpContextBase उदाहरण वापस जाने के लिए Autofac सेट कर लेते हैं, भले ही HttpService वर्ग जो भी करने के लिए HttpContextBase वर्तमान था पर रखती हूँ जब एकल HttpService उदाहरण बनाया गया था।

इस सिद्धांत का परीक्षण करने के लिए, सीधे पृष्ठ से HttpContextBase पर निर्भरता लेने का प्रयास करें, और देखें कि समस्या अभी भी होती है या नहीं। यह पता लगाना कि सिंगलटन घटक कौन सा है, यदि ऐसा है तो काफी सरल होना चाहिए।

+0

यह वही है जो मैंने किया था! HttpService और अन्य सेवाएं जो HttpService को कॉल करती हैं उन्हें सिंगलेटन्स के रूप में पंजीकृत किया जाता है। आपकी मदद निकोलस के लिए धन्यवाद। –

+0

@ChiChan उत्तर और आपकी टिप्पणी के आधार पर, आप इसे काम करने के लिए क्या बदल गए? क्या आपने सिंगलटन के अलावा कुछ और करने के लिए HttpService के जीवनकाल/दायरे को बदल दिया? – Stokedout

+0

@ स्टोकआउटआउट, हाँ, यह थोड़ी देर पहले था, लेकिन मैंने एचटीपीएस सेवा के सिंगलॉन पंजीकरण को दूसरे दायरे में बदल दिया। –

0

) वह यह है कि आप हमेशा HttContextWrapper का एक ही उदाहरण का उपयोग करेगा RegisterInstance (का उपयोग कर की तरह जीवन भर गुंजाइश के साथ HttpContextWrapper का पंजीयन है,। दूसरा अनुरोध इसलिए पहले अनुरोध के HttpContext का उपयोग करेगा, जिसके परिणामस्वरूप कुछ अजीब त्रुटि होगी।

संभव काम के आसपास: HttpContext के लिए अपने स्वयं के आवरण बना सकते हैं और उदाहरण के जीवन समय से पंजीकृत करें और यह वर्तमान HttpContext आंतरिक रूप का उपयोग करते हैं:,

public interface IMyWrapper 
{ 
    void ResponseRedirect(string url); 
} 

public class MyWrapper : IMyWrapper 
{ 
    public void ResponseRedirect(string url) 
    { 
     HttpContext.Current.Response.Redirect(url); 
    } 
} 

builder.Register(c => new MyWrapper()) 
    .As<IWrapper>() 
    .InstancePerLifetimeScope(); 

इस तरह आप HttpContext इंजेक्षन नहीं है, हालांकि । सुनिश्चित नहीं है कि यह महत्वपूर्ण है ...

+0

धन्यवाद! यह समाधान काम करेगा और वर्तमान में मेरे पास है, लेकिन मैं अभी भी सोच रहा हूं कि ऑटोफैक के भीतर संदर्भ को शांतिपूर्वक पंजीकृत करने का कोई तरीका है या नहीं। –

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