Stellen Sie sicher, dass HttpConfiguration.EnsureInitialized ()

142

Ich habe Visual Studio 2013 installiert und beim Ausführen meiner App wird der folgende Fehler angezeigt.

Ich habe keine Ahnung, wo ich dieses Objekt initialisieren soll.

Was ist zu tun?

    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

Dies ist für AlumCloud

Den Stapel zu füllen ist das, was ich tue
quelle

Antworten:

141

In der Antwort von @ gentiane unten finden Sie die richtige Vorgehensweise.

Versuchen Sie am Ende der Application_StartMethode Global.Asax.csFolgendes hinzuzufügen: -

GlobalConfiguration.Configuration.EnsureInitialized(); 
Ian Mercer
quelle
3
Ich habe diese Antwort erhalten und mein Projekt, das aus einer Vorschau-Version von VS 2013 generiert wurde, mit einem Projekt verglichen, das mit Update 1 generiert wurde. Der Unterschied besteht darin, dass WebApiConfig.Register (...) durch GlobalConfiguration.Configure (ersetzt wurde). ..) wie gentiane in ihrer antwort beschreibt. Dies behebt das Problem.
Bryan Bedard
1
Genau das GlobalConfiguration.Configure(Action<HttpConfiguration> configurationCallback)wird nach dem configurationCallback aufgerufen.
cmxl
4
Ein Fehler kann auch auftreten, wenn die DI-Konfiguration vor der GlobalConfiguration.Configure (WebApiConfig.Register) durchgeführt wird. Anruf
Silvos
Danke dir. Das war mir ein Dorn im Auge.
Robert Bolton
241

Wenn Sie dies am Ende von Application_Start tun, ist es zu spät, da WebApiConfig.Register aufgerufen wurde.

Der beste Weg, dies zu beheben, ist die Verwendung einer neuen Initialisierungsmethode durch Ersetzen in Global.asax:

WebApiConfig.Register(GlobalConfiguration.Configuration);

durch

GlobalConfiguration.Configure(WebApiConfig.Register);
Gentiane
quelle
12
Basierend auf der Microsoft-Dokumentation sollte dies der richtige Weg sein. asp.net/web-api/overview/web-api-routing-and-actions/…
Dalorzo
Ich habe eine MVC-App migriert, als die API-Routen nicht funktionierten. Ich habe diese hinzugefügt und MapHttpAttributeRoutes hat alles zum Leben erweckt.
Phil Cooper
1
Diese Antwort hat es für mich behoben.
GiddyUpHorsey
Aber was ist, wenn Sie eine nicht statische WebApiConfig-Klasse haben?
Georgy Grigoryev
@GeorgyGrigoryev: Sie können es einfach innerhalb der Aktion wie GlobalConfiguration.Configure(config => new WebApiConfig().Register(config));
folgt
69

Ich habe diesen Fehler tatsächlich erhalten, als ich das Attribut-Routing in meinem WebApi verwendet habe.

ich hatte

[Route ("webapi / siteTypes / {siteTypeId"]

anstatt

[Route ("webapi / siteTypes / {siteTypeId}"]

für meine Route und bekam diesen Fehler. Ich hatte einfach die schließende geschweifte Klammer verpasst. Nachdem ich es wieder hinzugefügt habe, ist dieser Fehler nicht mehr aufgetreten.

Jeff Yates
quelle
23
Ich hatte auch dieses Problem, als ich der Route einen Schrägstrich [Route ("/ api /"]) anstelle von [Route ("api")]
voranstellte
1
{int: id} statt {id: int}
Marat Batalandabad
1
Dieser bekommt mich die ganze Zeit, aber es gab einen anderen Fehler. Nach dem Upgrade auf Visual Studio 2015 und .Net 4.6 wird dieser Fehler angezeigt.
Nbering
7
Mein Fehler war [Route ("api / {parameter: string}")] anstelle von [Route ("api / {parameter}")]. Anscheinend ist: string als Typ falsch, da dies die Standardeinstellung ist.
Jamby
1
Ähnlich wie bei Jamby war mein Fehler, dass ich Folgendes benötigte: [Route ("api / ObjectOfInterest / {type} / {name}")] ... aber: [Route ("api / ObjectOfInterest / {type: string} / {name : string} ")] // FALSCH ... hat nicht funktioniert. Ich weiß, dass es seltsam ist, dass ich einen Parameter namens 'Type' benötige, der eine Zeichenfolge (und keine System.Type) ist ... aber die Zeichenfolgenspezifikation entfernt hat und gut funktioniert.
Aidanapword
31

Dies ist alt, aber das erste Ergebnis bei Google bei der Suche nach diesem Fehler. Nach einigem Graben konnte ich herausfinden, was los war.

tldr:
Alles, was GlobalConfiguration.Configure tut, ist, Ihre Aktion aufzurufen und EnsureInitialized () aufzurufen . config.MapAttributeRoutes () muss vor EnsureInitialized () aufgerufen werden, da EnsureInitialized nur einmal ausgeführt wird.

Das heißt: Wenn Sie aus einem vorhandenen Mvc-Projekt stammen, müssen Sie lediglich Folgendes tun:

  1. Add GlobalConfiguration.Configuration.EnsureInitialized (); an der Unterseite des Application_Start Methode.

ODER

  1. Verschieben Sie Ihre gesamte Konfiguration in einen einzigen Aufruf von GlobalConfiguration.Configure :
GlobalConfiguration.Configure(config => 
{
    WebApiConfig.Register(config);
    config.MapAttributeRoutes();
    ...
});

Tiefer Graben

HttpConfiguration.Configuration hat eine "Initializer" -Eigenschaft, die wie folgt definiert ist:

public Action<HttpConfiguration> Initializer;

HttpConfiguration.EnsureInitialized () führt diese Aktion aus und setzt _initialized auf true

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

HttpConfiguration.MapAttributeRoutes ruft die interne Methode AttributeRoutingMapper.MapAttributeRoutes auf, mit der HttpConfiguration.Initializer festgelegt wird

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 führt EnsureInitialized unmittelbar nach dem Aufrufen Ihrer Aktion aus:

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

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

Vergessen Sie nicht, dass die Quelle für asp.net unter http://aspnetwebstack.codeplex.com/SourceControl/latest verfügbar ist, wenn Sie auf eine Wand stoßen

tFeld
quelle
Die Lösung mit einem einzigen Aufruf von GlobalConfiguration.Configure hat mir das Leben gerettet. Ich hatte Probleme mit dem attributbasierten Routing und der DI-Konfiguration zusammen mit der richtigen Reihenfolge beim Aufrufen der Konfigurationen. Ich verwende auch MS ApiVersioning, wo ich die DI-Injektionen durchführen musste, bevor die erste Route die Versionierungsattribute erreicht. Vielen Dank
Silvos
12

Ich hatte ein ähnliches Problem. Manchmal GlobalConfiguration.Configurelöst ein mehrmaliger Aufruf diesen Fehler aus. Um dieses Problem zu umgehen, habe ich die gesamte Konfigurationsinitialisierungslogik an einem Ort zusammengefasst.

Gleno
quelle
Ja, das war definitiv das Problem in meinem Fall
Obi
Danke dir! Das war genau mein Problem.
Søren Boisen
Gleiches Problem hier! Ich habe ein paar Stunden lang versucht, das Problem zu beheben, also das x für den Kommentar.
Sc0tTy
7

Für mich bestand das Problem darin, dass ich versuchte, benannte Parameter für Abfragezeichenfolgenfelder in meinen Routen zu verwenden:

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

Abfragezeichenfolgenfelder werden automatisch Parametern zugeordnet und sind nicht Teil der Routendefinition. Das funktioniert:

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

Obwohl die obige Antwort funktioniert, wenn dies nicht festgelegt ist, wurde dieses Zeug in meinem Fall bereits festgelegt. Was anders war, war, dass ich für eine der APIs, die ich geschrieben hatte, der Route ein / vorangestellt hatte. Beispiel

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

Ändern Sie dies auf

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

habe es für mich behoben

Der 0bserver
quelle
@Svend In der Tat. Es schien eine dumme Sache zu sein, aber das scheint in einigen Fällen das Problem zu sein. : P
Der 0bserver
@ The0bserver das hat auch bei mir funktioniert. Die Diagnose war schwierig, da ich an der Spitze meiner Controller-Klasse einen HttpPrefixDekorateur hatte und dann für meinen individuellen Endpunkt den Dekorateur : [Route("/")]. Durch einfaches Übergeben eines leeren Strings in der Route wurde das Problem behoben.
David
1
Ich bin froh, dass es geholfen hat. :)
Der 0bserver
7

WENN DIESER FEHLER "AUS NIRGENDWO" KOMMT , dh Ihre App eine Weile einwandfrei funktioniert hat, fragen Sie sich: Habe ich einem Controller eine Aktion hinzugefügt oder Routen geändert, bevor dieser Fehler angezeigt wurde?

Wenn die Antwort ja lautet (und wahrscheinlich auch), haben Sie wahrscheinlich einen Fehler gemacht. Falsches Formatieren, Kopieren / Einfügen einer Aktion und Vergessen, um sicherzustellen, dass die Endpunktnamen eindeutig sind usw. führen Sie hierher. Der Vorschlag, den dieser Fehler bei der Behebung macht, kann dazu führen, dass Sie den falschen Baum bellen.

Byron Jones
quelle
Genau das ist mir passiert. Ich habe eine Route geändert, aber am Ende eine fehlerhafte geschweifte Klammer hinterlassen: [Route ("GetStuff}")]
Stu Price
2

Anruf

GlobalConfiguration.Configuration.MapHttpAttributeRoutes();

Vor

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

schließt seine Ausführung ab.

abatishchev
quelle
2

Ich habe diesen Fehler erhalten, als die Version von Newtonsoft.Json in meinem Hauptprojekt anders war als im Hilfsprojekt

David Lilljegren
quelle
Schnelle Ergänzung: Stellen Sie sicher, dass Sie Ihre Lösung bereinigen, nachdem Sie das Referenzproblem behoben haben, und überprüfen Sie, ob die endgültig bereitgestellte DLL die richtige Version ist :)
Marcel
1

Diese Ausnahme tritt normalerweise auf, wenn Routenvorlagen in "Attribut-Routing" nicht korrekt sind.

Zum Beispiel habe ich das bekommen, als ich den folgenden Code geschrieben habe:

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

In der Syntax für Routenbeschränkungen {Parameter: Einschränkung} ist die Einschränkung standardmäßig vom Typ Zeichenfolge . Keine Notwendigkeit, es explizit zu erwähnen.

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

Eines Tages bekam ich diesen Fehler. Nachdem ich unsere App geändert hatte, um anzurufen, EnsureInitialized()konnte ich die Grundursache erkennen.

Ich hatte ein benutzerdefiniertes Attribut, einen Filter für eine Aktion. Diese Attributklasse hatte eine grundlegende Änderung im NuGet-Paket vorgenommen, in dem sie lebt.

Obwohl ich den Code aktualisiert und alles kompiliert hatte, lud der lokale IIS-Worker eine alte DLL und fand während der Initialisierung kein Klassenmitglied, las Attribute für Aktionen usw.

Aus irgendeinem Grund (möglicherweise aufgrund der Reihenfolge / bei der Initialisierung unserer Protokollierung) war dieser Fehler nicht erkennbar, sodass die WebAPI möglicherweise in einem seltsamen Zustand blieb, bis ich hinzugefügt hatte, EnsureInitialized()was die Ausnahme abfing und auftauchte.

Durch eine ordnungsgemäße binund objsaubere Ausführung über ein handliches Skript wurde das Problem behoben.

Luke Puplett
quelle
0

In meinem Fall habe ich den Webservice in Projekt A erstellt und von Projekt B aus gestartet, und ich habe genau diesen Fehler erhalten. Das Problem war, dass einige DLL-Dateien, die von A benötigt werden, im Build-Output-Ordner von B fehlten. Stellen Sie sicher, dass diese DLL-Dateien verfügbar sind, um das Problem zu beheben.

Anion
quelle
0

In meinem Fall habe ich eine Entität als Parameter meiner Aktion verwendet, deren 'Schema' fehlt.

Falsches Attribut:

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

Richtig :

[Table("Table name", Schema = "schema name")]
Reza Nafisi
quelle