web-dev-qa-db-fra.com

Assurez-vous que HttpConfiguration.EnsureInitialized ()

J'ai installé Visual Studio 2013 et lorsque j'exécute mon application, l'erreur ci-dessous apparaît.

Je n'ai aucune idée de l'endroit où je dois initialiser cet objet.

Que faire?

    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

C'est pour AlumCloud

Voir la réponse de @ gentiane ci-dessous pour la manière correcte de gérer cela maintenant.

À la fin de la méthode Application_Start dans Global.Asax.cs, essayez d'ajouter: -

GlobalConfiguration.Configuration.EnsureInitialized(); 
131
Ian Mercer

Si vous le faites à la fin de Application_Start, il sera trop tard car WebApiConfig.Register a été appelé.

Le meilleur moyen de résoudre ce problème consiste à utiliser une nouvelle méthode d'initialisation en remplaçant dans Global.asax:

WebApiConfig.Register(GlobalConfiguration.Configuration);

par

GlobalConfiguration.Configure(WebApiConfig.Register);
222
gentiane

En fait, j'ai eu cette erreur lorsque j'utilisais le routage d'attributs dans WebApi.

J'ai eu 

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

au lieu de 

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

pour mon itinéraire et a cette erreur. J'avais tout simplement manqué la fermeture de la parenthèse fermante. Une fois que je l'ai rajouté, cette erreur ne s'est plus produite.

63
Jeff Yates

C'est vieux, mais c'est le premier résultat sur Google lors de la recherche de cette erreur. Après avoir creusé un peu, j'ai pu comprendre ce qui se passait.

tldr:
Tout ce que GlobalConfiguration.Configure fait appelle votre action et appelle EnsureInitialized (). config.MapAttributeRoutes () doit être appelé avant EnsureInitialized (), car EnsureInitialized ne s'exécute qu'une seule fois.

Signification: si vous venez d'un projet MVC existant, tout ce que vous avez à faire est de: 

  1. Ajouter GlobalConfiguration.Configuration.EnsureInitialized (); au bas de votre méthode Application_Start.

OR

  1. Déplacez toute votre configuration en un seul appel à GlobalConfiguration.Configure:
GlobalConfiguration.Configure(config => 
{
    WebApiConfig.Register(config);
    config.MapAttributeRoutes();
    ...
});

Creuser plus profond

HttpConfiguration.Configuration a une propriété "Initializer" définie comme ceci:

public Action<HttpConfiguration> Initializer;

HttpConfiguration.EnsureInitialized () exécute cette action et définit _initialized sur true

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

HttpConfiguration.MapAttributeRoutes appelle la méthode interne AttributeRoutingMapper.MapAttributeRoutes qui définit 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 exécute EnsureInitialized immédiatement après l'appel de votre action:

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

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

N'oubliez pas, si vous tombez sur un mur, le code source d'asp.net est disponible à l'adresse http://aspnetwebstack.codeplex.com/SourceControl/latest

29
tField

J'ai eu un problème connexe. Parfois, appeler GlobalConfiguration.Configure plusieurs fois déclenche cette erreur. Pour contourner le problème, j'ai mis toute la logique d'initialisation de la configuration au même endroit.

12
Gleno

Pour moi, le problème était que j'essayais d'utiliser des paramètres nommés pour les champs de chaîne de requête dans mes itinéraires:

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

Les champs de chaîne de requête sont automatiquement mappés sur des paramètres et ne font pas réellement partie de la définition de la route. Cela marche:

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

Bien que la réponse ci-dessus fonctionne si aucun cas n'est défini, dans mon cas, cette option était déjà définie. La différence était que, pour l’une des API que j’avais écrite, j’avais préfixé la route avec un /. Exemple 

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

.Changing cela pour 

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

corrigé pour moi

4
The 0bserver

SI CETTE ERREUR APPARAÎT DÉJÀ VENUE "HORS DE NUIT" , c'est-à-dire que votre application fonctionnait parfaitement bien pendant un moment, demandez-vous: ai-je ajouté une action à un contrôleur ou modifié des itinéraires avant de voir cette erreur?

Si la réponse est oui (et c'est probablement le cas), vous avez probablement commis une erreur dans le processus. Un formatage incorrect, copier/coller une action et oublier de s’assurer que les noms des terminaux sont uniques, etc. vous mèneront tous ici. La suggestion que cette erreur fait sur la façon de la résoudre peut vous envoyer aboyer le mauvais arbre.

3
Byron Jones

J'ai eu cette erreur lorsque la version de Newtonsoft.Json était différente dans mon projet principal par rapport au projet helper

2
David Lilljegren

On obtient généralement cette exception lorsque les modèles de route dans "Attribute Routing" ne sont pas appropriés.

Par exemple, j'ai eu ceci quand j'ai écrit le code suivant:

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

Dans les contraintes de route syntaxe {paramètre: contrainte}, la contrainte par défaut est de type string . Pas besoin de le mentionner explicitement.

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

Appel

GlobalConfiguration.Configuration.MapHttpAttributeRoutes();

avant

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

termine son exécution.

1
abatishchev

J'ai commencé à avoir cette erreur un jour. Après avoir modifié notre application pour appeler EnsureInitialized(), j'ai pu en identifier la cause.

J'ai eu un attribut personnalisé, un filtre, sur une action. Un changement radical a été apporté à cette classe d'attributs dans le paquet NuGet dans lequel elle réside.

Même si j'avais mis à jour le code et tout compilé, le travailleur local IIS chargeait un ancien DLL et ne trouvait pas de membre de classe pendant l'initialisation, lisait les attributs sur les actions, etc.

Pour une raison quelconque (probablement en raison de l'ordre/lorsque notre journalisation est initialisée), cette erreur n'était pas détectable, laissant éventuellement WebAPI dans un état étrange, jusqu'à ce que j'aie ajouté EnsureInitialized() qui a capturé l'exception et qui l'a refait surface.

Effectuer les nettoyages bin et obj appropriés via un script pratique a résolu le problème.

0
Luke Puplett