Assicurarsi che HttpConfiguration.EnsureInitialized ()


142

Ho installato Visual Studio 2013 e quando eseguo la mia app ottengo l'errore di seguito.

Non ho idea di dove devo inizializzare questo oggetto.

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

Risposte:


141

Vedi la risposta di @ gentiane di seguito per il modo corretto di gestirlo ora.

Alla fine del Application_Startmetodo Global.Asax.csprova ad aggiungere: -

GlobalConfiguration.Configuration.EnsureInitialized(); 

3
Stavo ottenendo questa risposta, quindi ho confrontato il mio progetto che è stato generato da una versione di anteprima di VS 2013 con una che è stata generata con l'aggiornamento 1 e la differenza è che hanno sostituito WebApiConfig.Register (...) con GlobalConfiguration.Configure (. ..) come descrive gentiane nella loro risposta. Questo risolve il problema.
Bryan Bedard,

1
Questo è esattamente ciò GlobalConfiguration.Configure(Action<HttpConfiguration> configurationCallback)che chiamerà dopo il configurationCallback.
cmxl

4
L'errore può anche verificarsi quando la configurazione DI viene eseguita prima di GlobalConfiguration.Configure (WebApiConfig.Register); call
Silvos,

Grazie. Questa è stata una spina nel fianco.
Robert Bolton,

241

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

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

WebApiConfig.Register(GlobalConfiguration.Configuration);

di

GlobalConfiguration.Configure(WebApiConfig.Register);

12
Sulla base della documentazione Microsoft, questo dovrebbe essere il modo giusto per farlo. asp.net/web-api/overview/web-api-routing-and-actions/…
Dalorzo

Sto migrando un'app mvc, quando i percorsi API non funzionavano, aggiungendo questo e MapHttpAttributeRoutes ha dato vita a tutto.
Phil Cooper,

1
Questa risposta l'ha risolto per me.
GiddyUpHorsey,

Ma cosa succede se si dispone di classe non statica WebApiConfig?
Georgy Grigoryev,

@GeorgyGrigoryev: puoi solo istanziarlo all'interno dell'azione in questo modo:GlobalConfiguration.Configure(config => new WebApiConfig().Register(config));
cmxl

69

In realtà ho riscontrato questo errore durante l'utilizzo del routing degli attributi nel 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 aggiunto nuovamente, questo errore non si è verificato più.


23
Ho avuto anche questo problema quando ho anteposto il percorso con una barra [Percorso ("/ api /"]) anziché [Percorso ("api")]
cguedel

1
{int: id} invece di {id: int}
Marat Batalandabad,

1
Questo mi dà sempre, ma mi dava un errore diverso. Dopo l'aggiornamento a Visual Studio 2015 e .Net 4.6 ottengo questo errore.
Nbering

7
Il mio errore era [Route ("api / {parametro: stringa}")] invece di [Route ("api / {parametro}")]. Apparentemente mettendo: stringa come tipo è sbagliata in quanto è l'impostazione predefinita.
Jamby,

1
Simile a Jamby, il mio errore era che avevo bisogno di: [Route ("api / ObjectOfInterest / {type} / {name}")] ... ma: [Route ("api / ObjectOfInterest / {type: string} / {name : string} ")] // WRONG ... non funzionava. So che è strano che ho bisogno di un parametro chiamato 'Type' che è una stringa (e non un System.Type) ... ma ho rimosso la specifica della stringa e funziona benissimo.
Aidanapword,

31

Questo è vecchio, ma è il primo risultato su Google quando si cerca questo errore. Dopo aver scavato un bel po 'sono stato in grado di capire cosa stesse succedendo.

tldr:
Tutto ciò che fa GlobalConfiguration.Configure è invocare la tua azione e chiamare garantireInitialized () . config.MapAttributeRoutes () deve essere chiamato prima di SecureInitialized () poiché SecureInitialized viene eseguito una sola 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 una singola 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<HttpConfiguration> 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<HttpConfiguration> previousInitializer = configuration.Initializer;
    configuration.Initializer = config =>
    {
        previousInitializer(config);
        ...
    };
}

GlobalConfiguration.Configure esegue SecureInitialized immediatamente dopo aver richiamato l'azione:

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

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

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


La soluzione con una sola chiamata a GlobalConfiguration.Configure mi ha salvato la vita. Ho avuto problemi con il routing basato sugli attributi e la configurazione DI insieme al corretto ordine di chiamata delle configurazioni. Uso anche MS ApiVersioning, dove avevo bisogno delle iniezioni DI fatte prima che la prima rotta colpisse gli attributi di versioning.
Grazie

12

Ho avuto un problema correlato. Talvolta la chiamata GlobalConfiguration.Configurepiù volte genera questo errore. Come soluzione alternativa, ho messo tutta la logica di inizializzazione della configurazione in un unico posto.


Sì, questo è stato sicuramente il problema nel mio caso
Obi

Grazie! Questo era esattamente il mio problema.
Søren Boisen,

Lo stesso problema qui! Ho provato a risolvere il problema per un paio d'ore, quindi la x per il commento.
Sc0tTy

7

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

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

I campi della stringa di query vengono automaticamente associati ai parametri e in realtà non fanno parte della definizione del percorso. Questo funziona:

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

7

Anche se la risposta sopra funziona se non è stato impostato, nel mio caso questa roba era già impostata. La cosa diversa 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}")]

riparato per me


@Svend Indeed. Sembrava una cosa stupida, ma sembra che questo sia il problema in parecchi casi. : P
Il server 0

@ The0bserver ha funzionato anche per me. E 'stato difficile da diagnosticare perché in cima alla mia classe controller ho avuto un HttpPrefixdecoratore e quindi per il mio punto finale individuale ho avuto il decoratore: [Route("/")]. Semplicemente passando una stringa vuota nel percorso risolto il problema.
David,

1
Sono contento che abbia aiutato. :)
The 0bserver,

7

SE QUESTO ERRORE SEMBRA AVERE ARRIVATO "FUORI DALL'ORA" , ovvero la tua app funzionava perfettamente per un po ', chiediti: ho aggiunto un'azione a un controller o ho cambiato percorso prima di vedere questo errore?

Se la risposta è sì (e probabilmente lo è), probabilmente hai commesso un errore nel processo. La formattazione errata, la copia / incolla di un'azione e la dimenticanza di assicurarsi che i nomi degli endpoint siano univoci, ecc. Finiranno tutti qui. Il suggerimento che questo errore fa su come risolverlo può farti abbaiare l'albero sbagliato.


Questo è esattamente quello che mi è successo. Ho cambiato rotta ma alla fine avevo lasciato una parentesi graffa errata in questo modo: [Route ("GetStuff}")]
Stu Price

2

Chiamata

GlobalConfiguration.Configuration.MapHttpAttributeRoutes();

prima

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

completa la sua esecuzione.


2

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


Aggiunta rapida: assicurati di pulire la soluzione dopo aver risolto il problema di riferimento e ricontrolla che la DLL distribuita finale sia la versione corretta :)
Marcel

1

In genere si ottiene questa eccezione quando i modelli di percorso in "Instradamento attributi" non sono corretti.

Ad esempio, ho ottenuto questo quando ho scritto il seguente codice:

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

Nella sintassi dei vincoli di rotta {parametro: vincolo}, il vincolo di default è di tipo stringa . Non c'è bisogno di menzionarlo esplicitamente.

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

0

Ho iniziato a ricevere questo errore un giorno. Dopo aver modificato l'app per chiamare, EnsureInitialized()sono stato in grado di vedere la causa principale.

Avevo un attributo personalizzato, un filtro, su un'azione. Quella classe di attributi aveva subito una rottura nel pacchetto NuGet in cui vive.

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

Per qualche motivo (probabilmente a causa di un ordine / quando la nostra registrazione è inizializzata), questo errore non era rilevabile, lasciando eventualmente la WebAPI in uno stato strano, fino a quando non avessi aggiunto EnsureInitialized() che ha catturato l'eccezione e l'ho emersa.

L'esecuzione di una corretta bine objpulita tramite un pratico script lo ha risolto.


0

Nel mio caso ho creato il servizio web nel progetto A e l'ho avviato dal Progetto B e ho riscontrato esattamente questo errore. Il problema era che alcuni file .dll richiesti da A erano mancanti nella cartella build-output di B. Assicurarsi che questi file .dll siano disponibili.


0

Nel mio caso, ho usato un'entità come parametro della mia azione che manca il suo "schema".

Attributo errato:

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

Corretta :

[Table("Table name", Schema = "schema name")]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.