सुनिश्चित करें कि HttpConfiguration.EnsureInitialized ()


142

मैंने विजुअल स्टूडियो 2013 स्थापित किया है और जब मैं अपना ऐप चलाता हूं तो मुझे नीचे त्रुटि मिलती है।

मुझे नहीं पता कि मैं इस ऑब्जेक्ट को इनिशियलाइज़ करने के लिए कहाँ हूँ।

क्या करें?

    Server Error in '/' Application.

The object has not yet been initialized. Ensure that HttpConfiguration.EnsureInitialized() is called in the application's startup code after all other initialization code.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.InvalidOperationException: The object has not yet been initialized. Ensure that HttpConfiguration.EnsureInitialized() is called in the application's startup code after all other initialization code.

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace: 


[InvalidOperationException: The object has not yet been initialized. Ensure that HttpConfiguration.EnsureInitialized() is called in the application's startup code after all other initialization code.]
   System.Web.Http.Routing.RouteCollectionRoute.get_SubRoutes() +101
   System.Web.Http.Routing.RouteCollectionRoute.GetRouteData(String virtualPathRoot, HttpRequestMessage request) +63
   System.Web.Http.WebHost.Routing.HttpWebRoute.GetRouteData(HttpContextBase httpContext) +107
   System.Web.Routing.RouteCollection.GetRouteData(HttpContextBase httpContext) +233
   System.Web.Routing.UrlRoutingModule.PostResolveRequestCache(HttpContextBase context) +60
   System.Web.Routing.UrlRoutingModule.OnApplicationPostResolveRequestCache(Object sender, EventArgs e) +82
   System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +136
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +69

Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.18408

यह AlumCloud के लिए है

जवाबों:


141

अब इसे संभालने के सही तरीके के लिए @ gentiane का जवाब नीचे देखें ।

जोड़ने की कोशिश Application_Startमें विधि के अंत में Global.Asax.cs: -

GlobalConfiguration.Configuration.EnsureInitialized(); 

3
मुझे यह उत्तर मिल रहा था इसलिए मैंने अपने प्रोजेक्ट की तुलना वीएस 2013 के पूर्वावलोकन संस्करण से की थी जो कि अपडेट 1 के साथ उत्पन्न हुआ था और यह अंतर है कि उन्होंने WebApiConfig.Register (...) को GlobalConfiguration .Configure () से बदल दिया है। ..) के रूप में gentiane उनके जवाब में वर्णन करता है। यह समस्या को हल करता है।
ब्रायन Bedard

1
यह वही है जो GlobalConfiguration.Configure(Action<HttpConfiguration> configurationCallback)कॉन्फ़िगरेशनकॉलबैक के बाद कॉल करेगा।
cmxl

4
GlobalConfiguration.Configure (WebApiConfig.Register) से पहले DI कॉन्फ़िगरेशन किए जाने पर त्रुटि भी हो सकती है; call
सिल्वोस

धन्यवाद। वह मेरे पक्ष में एक कांटा बन गया है।
रॉबर्ट बोल्टन

241

यदि आप इसे Application_Start के अंत में करते हैं तो बहुत देर हो जाएगी, जैसा कि WebApiConfig.Register को कहा गया है।

इसे हल करने का सबसे अच्छा तरीका Global.asax में बदलकर नई इनिशियलाइज़ेशन विधि का उपयोग करना है:

WebApiConfig.Register(GlobalConfiguration.Configuration);

द्वारा

GlobalConfiguration.Configure(WebApiConfig.Register);

12
Microsoft दस्तावेज़ीकरण के आधार पर इसे करने का सही तरीका होना चाहिए। asp.net/web-api/overview/web-api-rout-and-actions/…
Dalorzo

मैं एक mvc ऐप को माइग्रेट कर रहा हूं, जब एपीआई रूट काम नहीं कर रहे थे, इसे जोड़कर और MapHttpAttributeRoutes ने इसे जीवन में लाया।
फिल कूपर

1
इस जवाब ने इसे मेरे लिए तय कर दिया।
गिद्दीउपोरसी

लेकिन अगर WebApiConfig गैर-स्थिर वर्ग है तो क्या होगा?
जार्ज ग्रिगोरीव

@GeorgyGrigoryev: आप इसे तुरंत एक्शन के अंदर इंस्टेंट कर सकते हैं जैसे:GlobalConfiguration.Configure(config => new WebApiConfig().Register(config));
cmxl

69

मुझे वास्तव में यह त्रुटि तब मिली जब मैं अपने वेबएपीआई में एट्रीब्यूट रूटिंग का उपयोग कर रहा था।

मैं था

[रूट ( "WebAPI / siteTypes / {siteTypeId"]

के बजाय

[रूट ( "WebAPI / siteTypes / {siteTypeId}"]

मेरे मार्ग के लिए और यह त्रुटि मिली। मैं बस बंद घुंघराले ब्रैकेट को याद किया था। एक बार जब मैंने इसे वापस जोड़ा, यह त्रुटि फिर से नहीं हुई।


23
जब मैं स्लैश [मार्ग ("/ api /"]] के स्थान पर [रूट ("एपीआई")] के स्थान पर उपसर्ग करता था, तो मुझे भी यह समस्या थी
cguedel

1
{int: id} के बजाय {आईडी: int}
मराट बटालाबाद

1
यह मुझे हर समय मिलता है, लेकिन यह एक अलग त्रुटि देता था। दृश्य स्टूडियो 2015 और .net 4.6 में अपग्रेड करने के बाद मुझे यह त्रुटि मिलती है।
nbering

7
मेरी त्रुटि [मार्ग ("एपीआई / {पैरामीटर}") के बजाय [मार्ग ("एपीआई / {पैरामीटर: स्ट्रिंग}")] थी। जाहिर है: स्ट्रिंग गलत है क्योंकि यह डिफ़ॉल्ट है।
जेबी

1
जेम्बी के समान, मेरी त्रुटि यह थी कि मुझे जरूरत थी: [मार्ग ("api / ObjectOfInterest / {type} / {name}")] ... लेकिन: [मार्ग ("api / ObjectOfInterest / {प्रकार: स्ट्रिंग / / {name] : string} ")] // गलत ... काम नहीं कर रहा था। मुझे पता है कि यह अजीब है कि मुझे 'टाइप' नामक एक पैरामीटर की आवश्यकता है जो एक स्ट्रिंग है (और सिस्टमटाइप नहीं है) ... लेकिन स्ट्रिंग विनिर्देश को हटा दिया गया है और यह ठीक काम करता है।
एडनपॉवर्ड

31

यह पुराना है, लेकिन इस त्रुटि की खोज करते समय Google पर पहला परिणाम है। काफी खुदाई के बाद मैं यह पता लगाने में सक्षम था कि क्या चल रहा था।

tldr:
All GlobalConfiguration.Configure करता है आपकी कार्रवाई को आमंत्रित करता है और EnsureInitialized () कॉल करता है । config.MapAttributeRoutes () EnsureInitialized () से पहले कॉल किया जाना चाहिए क्योंकि EnsureInitialized केवल एक बार चलता है।

अर्थ: यदि आप एक मौजूदा Mvc प्रोजेक्ट से आ रहे हैं, तो आपको बस इतना करना है:

  1. GlobalConfiguration.Configuration.EnsureInitialized () जोड़ें ; आपके Application_Start पद्धति के नीचे ।

या

  1. GlobalConfiguration.Configure में अपने पूरे कॉन्फ़िगरेशन को एक कॉल में ले जाएं :
GlobalConfiguration.Configure(config => 
{
    WebApiConfig.Register(config);
    config.MapAttributeRoutes();
    ...
});

गहरा खोदना

HttpConfiguration.Configuration में "Initializer" गुण इस प्रकार परिभाषित किया गया है:

public Action<HttpConfiguration> Initializer;

HttpConfiguration.EnsureInitialized () इस क्रिया को चलाता है और _initialized को सत्य पर सेट करता है

public void EnsureInitialized()
{ 
    if (_initialized)
    {
        return;
    }
    _initialized = true;
    Initializer(this);            
}

HttpConfiguration.MapAttributeRoutes आंतरिक विधि को कॉल करता है AttributeRoutMapper.MapAttributeRoutes जो HttpConfiguration.Initializer सेट करता है

public static void MapAttributeRoutes(...)
{
    RouteCollectionRoute aggregateRoute = new RouteCollectionRoute();
    configuration.Routes.Add(AttributeRouteName, aggregateRoute);

    ...

    Action<HttpConfiguration> previousInitializer = configuration.Initializer;
    configuration.Initializer = config =>
    {
        previousInitializer(config);
        ...
    };
}

GlobalConfiguration.Configure रन EnsureInitialized अपनी कार्रवाई लागू करने के तुरंत बाद:

public static void Configure(Action<HttpConfiguration> configurationCallback)
{
    if (configurationCallback == null)
    {
        throw new ArgumentNullException("configurationCallback");
    }

    configurationCallback.Invoke(Configuration);
    Configuration.EnsureInitialized();
}

मत भूलो, यदि आप एक दीवार में भागते हैं, तो asp.net के लिए स्रोत http://aspnetwebstack.codeplex.com/SourceControl/latest पर उपलब्ध है


GlobalConfiguration.Configure के लिए सिंगल कॉल के साथ समाधान ने मेरा जीवन बचाया। कॉन्फ़िगरेशन को कॉल करने के सही क्रम के साथ विशेषता आधारित रूटिंग और DI कॉन्फ़िगरेशन के साथ मेरे पास समस्याएँ थीं। मैं MS ApiVersioning का उपयोग करता हूं, जहां मुझे पहले रूट संस्करण विशेषताओं को हिट करने से पहले किए गए DI इंजेक्शन की आवश्यकता थी। Thx a लॉट
सिल्वोस

12

मैं एक संबंधित मुद्दा था। कभी-कभी कॉलिंग GlobalConfiguration.Configureकई बार इस त्रुटि को ट्रिगर करती है। वर्कअराउंड के रूप में, मैंने सभी कॉन्फ़िगरेशन इनिशियलाइज़ेशन लॉजिक को एक जगह पर रखा है।


हाँ, यह निश्चित रूप से मेरे मामले में मुद्दा था
ओबी

धन्यवाद! यह वास्तव में मेरी समस्या थी।
सोरेन बोइसन

एक ही मुद्दा यहाँ! कुछ घंटों के लिए समस्या को ठीक करने की कोशिश कर रहा है, इसलिए टिप्पणी के लिए एक्स।
Sc0tTy

7

मेरे लिए, समस्या यह थी कि मैं अपने मार्गों में क्वेरी स्ट्रिंग फ़ील्ड के लिए नामित मापदंडों का उपयोग करने की कोशिश कर रहा था:

[Route("my-route?field={field}")]
public void MyRoute([FromUri] string field)
{
}

क्वेरी स्ट्रिंग फ़ील्ड स्वचालित रूप से मापदंडों पर मैप किए जाते हैं और वास्तव में रूट परिभाषा का हिस्सा नहीं होते हैं। यह काम:

[Route("my-route")]
public void MyRoute([FromUri] string field)
{
}

7

यद्यपि उपरोक्त उत्तर काम करता है अगर incase सेट नहीं है, तो मेरे मामले में यह सामान पहले से ही सेट था। जो अलग था वह था, मेरे द्वारा लिखे गए एपीआई में से एक के लिए, मैंने / के साथ मार्ग को उपसर्ग किया था। उदाहरण

[Route("/api/abc/{client}")] 

यह करने के लिए धन्यवाद

[Route("api/abc/{client}")]

यह मेरे लिए तय है


@Svend वास्तव में। एक बेवकूफ की तरह लग रहा था, लेकिन लगता है कि काफी कुछ मामलों में यह मुद्दा है। : P
0bserver

@ The0bserver ने मेरे लिए भी यह काम किया। इसका निदान करना मुश्किल था क्योंकि मेरे नियंत्रक वर्ग के शीर्ष पर मेरे पास एक HttpPrefixडेकोरेटर था और फिर मेरे व्यक्तिगत समापन बिंदु के लिए मेरे पास डेकोरेटर था [Route("/")]:। बस मार्ग में एक खाली स्ट्रिंग पास करके इस मुद्दे को तय किया।
डेविड

1
खुशी है कि यह मदद की। :)
०३ सेवर

7

यदि यह त्रुटि "अब से बाहर" आया है , यानी आपका ऐप थोड़ी देर के लिए पूरी तरह से ठीक काम कर रहा था, तो अपने आप से पूछें: क्या मैंने किसी नियंत्रक से कोई क्रिया जोड़ी या इस त्रुटि को देखने से पहले किसी भी मार्ग को बदल दिया?

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


मेरे साथ ठीक ऐसा ही हुआ। मैंने एक मार्ग बदल दिया, लेकिन इस तरह एक गलत कर्ली ब्रेस को अंत में छोड़ दिया था: [मार्ग ("गेटस्टफ}")]
स्टु प्राइस

2

कॉल

GlobalConfiguration.Configuration.MapHttpAttributeRoutes();

इससे पहले

GlobalConfiguration.Configure(c => ...);

इसका निष्पादन पूरा करता है।


2

मुझे यह त्रुटि तब हुई जब हेल्पर प्रोजेक्ट की तुलना में न्यूटनसॉफ्ट.जॉन का संस्करण मेरे मुख्य प्रोजेक्ट में अलग था


त्वरित जोड़: संदर्भ समस्या को ठीक करने के बाद अपने समाधान को साफ करना सुनिश्चित करें और यह जांचें कि अंतिम तैनात DLL सही संस्करण है :)
Marcel

1

आम तौर पर यह अपवाद तब मिलता है जब "विशेषता रूटिंग" में मार्ग टेम्पलेट उचित नहीं होते हैं।

उदाहरण के लिए, निम्न कोड लिखने पर मुझे यह मिला:

[Route("{dirName:string}/contents")] //incorrect
public HttpResponseMessage GetDirContents(string dirName) { ... }

मार्ग में बाधा वाक्य रचना {पैरामीटर: बाधा}, डिफ़ॉल्ट रूप से बाधा प्रकार स्ट्रिंग की है । इसका स्पष्ट उल्लेख करने की आवश्यकता नहीं है।

[Route("{dirName}/contents")] //correct
public HttpResponseMessage GetDirContents(string dirName) { ... }

0

मुझे एक दिन यह त्रुटि होने लगी। मैं कॉल करने के लिए हमारे ऐप को बदलने के बाद मैं EnsureInitialized()मूल कारण देखने में सक्षम था।

मेरे पास एक कार्रवाई पर एक कस्टम विशेषता, एक फिल्टर था। उस विशेषता वर्ग के पास NuGet पैकेज में एक ब्रेकिंग परिवर्तन था जिसमें वह रहता है।

भले ही मैंने कोड को अपडेट किया हो और यह सब संकलित किया गया हो, स्थानीय IIS कार्यकर्ता एक पुराने DLL को लोड कर रहा था और आरंभीकरण के दौरान एक वर्ग के सदस्य को नहीं ढूंढ रहा था, क्रियाओं पर विशेषताएँ पढ़ रहा था आदि।

किसी कारण से (संभवतः ऑर्डर के कारण / जब हमारे लॉगिंग को इनिशियलाइज़ किया जाता है), यह त्रुटि खोजी नहीं थी, संभवत: वेबएपीआई को एक अजीब स्थिति में छोड़ते हुए, जब तक कि मैंने जोड़ा नहीं EnsureInitialized()जो अपवाद को पकड़ा और इसे सामने लाया।

एक आसान स्क्रिप्ट के माध्यम से एक उचित binऔर objस्वच्छ प्रदर्शन करके इसे हल किया।


0

मेरे मामले में मैंने प्रोजेक्ट A में webservice बनाई और प्रोजेक्ट B से इसे शुरू किया और मुझे यह त्रुटि ठीक मिली। समस्या यह थी कि कुछ .dll-files जो कि B के निर्माण-आउटपुट-फोल्डर में A की अनुपलब्धता की आवश्यकता होती है, सुनिश्चित करें कि ये .dll-files उपलब्ध हैं।


0

मेरे मामले में, मैंने अपनी कार्रवाई के पैरामीटर के रूप में एक इकाई का उपयोग किया है कि इसका 'स्कीमा' गायब है।

गलत विशेषता:

[Table("Table name", Schema = "")]

सही बात :

[Table("Table name", Schema = "schema name")]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.