Assicurati che HttpConfiguration.EnsureInitialized ()

Ho installato Visual Studio 2013 e quando eseguo la mia app ottengo l’errore qui sotto.

Non ho idea di dove inizializzare questo object.

Cosa fare?

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 

Questo è per AlumCloud

Vedi la risposta di @ Gentiane qui sotto per il modo corretto di gestirlo ora.

Alla fine del metodo Application_Start in Global.Asax.cs prova ad aggiungere: –

 GlobalConfiguration.Configuration.EnsureInitialized(); 

Se lo fai alla fine di Application_Start sarà troppo tardi, come è stato chiamato WebApiConfig.Register.

Il modo migliore per risolvere questo è utilizzare il nuovo metodo di inizializzazione sostituendo in Global.asax:

 WebApiConfig.Register(GlobalConfiguration.Configuration); 

di

 GlobalConfiguration.Configure(WebApiConfig.Register); 

In realtà ho ricevuto questo errore quando stavo usando Attribute Routing all’interno del mio WebApi.

avevo

[Percorso ( “WebAPI / siteTypes / {siteTypeId”]

invece di

[Percorso ( “WebAPI / siteTypes / {} siteTypeId”]

per il mio percorso e ho ricevuto questo errore. Mi ero semplicemente perso la parentesi graffa di chiusura. Una volta che l’ho aggiunto, questo errore non si è verificato di nuovo.

Questo è vecchio, ma è il primo risultato su google durante la ricerca di questo errore. Dopo un po ‘di scavo, sono riuscito a capire cosa stava succedendo.

TLDR:
Tutto GlobalConfiguration.Configure fa invocare l’azione e chiamare ConfirmInitialized () . config.MapAttributeRoutes () deve essere chiamato prima di ConfirmInitialized () poiché ConfirmInitialized viene eseguito solo una volta.

Significato: se provieni da un progetto Mvc esistente, tutto ciò che devi fare è:

  1. Aggiungi GlobalConfiguration.Configuration.EnsureInitialized (); nella parte inferiore del metodo Application_Start .

O

  1. Sposta l’intera configurazione in un’unica chiamata a GlobalConfiguration.Configure :
 GlobalConfiguration.Configure(config => { WebApiConfig.Register(config); config.MapAttributeRoutes(); ... }); 

Scavando più a fondo

HttpConfiguration.Configuration ha una proprietà “Initializer” definita in questo modo:

 public Action Initializer; 

HttpConfiguration.EnsureInitialized () esegue questa azione e imposta _initialized su true

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

HttpConfiguration.MapAttributeRoutes chiama il metodo interno AttributeRoutingMapper.MapAttributeRoutes che imposta HttpConfiguration.Initializer

 public static void MapAttributeRoutes(...) { RouteCollectionRoute aggregateRoute = new RouteCollectionRoute(); configuration.Routes.Add(AttributeRouteName, aggregateRoute); ... Action previousInitializer = configuration.Initializer; configuration.Initializer = config => { previousInitializer(config); ... }; } 

GlobalConfiguration.Configure viene eseguito con InitInizializzato immediatamente dopo aver richiamato l’azione:

 public static void Configure(Action configurationCallback) { if (configurationCallback == null) { throw new ArgumentNullException("configurationCallback"); } configurationCallback.Invoke(Configuration); Configuration.EnsureInitialized(); } 

Non dimenticarti, se ti imbatti in un muro, la fonte di asp.net è disponibile su http://aspnetwebstack.codeplex.com/SourceControl/latest

Ho avuto un problema correlato. A volte la chiamata a GlobalConfiguration.Configure più volte triggers questo errore. Come soluzione alternativa, ho messo tutta la logica di inizializzazione della configurazione in un unico punto.

Per me, il problema era che stavo cercando di utilizzare i parametri denominati per i campi stringa di query nei miei percorsi:

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

I campi stringa di query vengono automaticamente associati ai parametri e non fanno parte della definizione della rotta. Questo funziona:

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

Anche se la risposta di cui sopra funziona se incase che non è impostato, nel mio caso questa roba era già impostata. Quello che era diverso era che, per una delle API che avevo scritto, avevo preceduto il percorso con un /. Esempio

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

. Cambiando questo a

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

risolto per me

Ho ricevuto questo errore quando la versione di Newtonsoft.Json era diversa nel mio progetto principale rispetto al progetto di supporto

SE QUESTO ERRORE SEMBRA ESSERE VENUTO “FUORI DA QUI” , ovvero se la tua app funzionava perfettamente per un po ‘, chiediti: ho aggiunto un’azione a un controller o cambiato percorsi prima di vedere questo errore?

Se la risposta è sì (e probabilmente lo è), probabilmente hai commesso un errore nel processo. Formattazione errata, copia / incolla di un’azione e dimenticando di assicurarsi che i nomi degli endpoint siano unici, ecc. Tutto ti finirà qui. Il suggerimento che questo errore fa su come risolverlo può mandarti ad abbaiare dall’albero sbagliato.

Chiamata

 GlobalConfiguration.Configuration.MapHttpAttributeRoutes(); 

prima

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

completa la sua esecuzione.

Solitamente si ottiene questa eccezione quando i modelli di percorso in “Instradamento attributi” non sono corretti.

Ad esempio, ho capito quando ho scritto il seguente codice:

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

In route constraints syntax {parameter: constraint}, il vincolo di default è di tipo string . Non c’è bisogno di menzionarlo esplicitamente.

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

Ho iniziato a ricevere questo errore un giorno. Dopo aver modificato la nostra app per chiamare EnsureInitialized() sono riuscito a vedere la causa principale.

Ho avuto un attributo personalizzato, un filtro, su un’azione. Quella class di attributi aveva subito un cambiamento significativo nel pacchetto NuGet in cui vive.

Anche se avevo aggiornato il codice e compilato tutto, il lavoratore IIS locale stava caricando una vecchia DLL e non trovando un membro della class durante l’inizializzazione, leggendo gli attributi sulle azioni, ecc.

Per qualche ragione (probabilmente a causa dell’ordine / quando la nostra registrazione è inizializzata), questo errore non è stato individuabile, forse lasciando WebAPI in uno stato strano, fino a quando non ho aggiunto l’ EnsureInitialized() che ha rilevato l’eccezione ed è emersa.

L’esecuzione di un bin appropriato e di obj clean tramite un comodo script lo ha risolto.