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();
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);
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.
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:
- Ajouter GlobalConfiguration.Configuration.EnsureInitialized (); au bas de votre méthode Application_Start.
- Déplacez toute votre configuration en un seul appel à GlobalConfiguration.Configure:
GlobalConfiguration.Configure(config =>
{
WebApiConfig.Register(config);
config.MapAttributeRoutes();
...
});
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
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.
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)
{
}
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
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.
J'ai eu cette erreur lorsque la version de Newtonsoft.Json était différente dans mon projet principal par rapport au projet helper
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) { ... }
Appel
GlobalConfiguration.Configuration.MapHttpAttributeRoutes();
avant
GlobalConfiguration.Configure(c => ...);
termine son exécution.
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.