Asegúrese de que HttpConfiguration.EnsureInitialized ()

Instalé Visual Studio 2013 y cuando ejecuto mi aplicación, aparece el siguiente error.

No tengo idea de dónde debo inicializar este objeto.

¿Qué hacer?

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 

Esto es para AlumCloud

Consulte la respuesta de @ gentiane a continuación para conocer la forma correcta de manejar esto ahora.

Al final del método Application_Start en Global.Asax.cs intente agregar:

 GlobalConfiguration.Configuration.EnsureInitialized(); 

Si lo hace al final de Application_Start, será demasiado tarde, ya que se ha llamado a WebApiConfig.Register.

La mejor manera de resolver esto es usar un nuevo método de inicialización al reemplazar en Global.asax:

 WebApiConfig.Register(GlobalConfiguration.Configuration); 

por

 GlobalConfiguration.Configure(WebApiConfig.Register); 

De hecho, recibí este error cuando estaba usando Attribute Routing dentro de mi WebApi.

tuve

[Ruta (“webapi / siteTypes / {siteTypeId”]

en lugar de

[Ruta (“webapi / siteTypes / {siteTypeId}”]

para mi ruta y obtuve este error. Simplemente había perdido el corchete de cierre. Una vez que lo agregué de nuevo, este error no volvió a ocurrir.

Esto es antiguo, pero es el primer resultado en google al buscar este error. Después de excavar un poco, pude descifrar qué estaba pasando.

tldr:
Todo lo que GlobalConfiguration.Configure hace es invocar su acción y llamar a EnsureInitialized () . Se debe llamar a config.MapAttributeRoutes () antes de EnsureInitialized () ya que EnsureInitialized solo se ejecuta una vez.

Significado: si vienes de un proyecto Mvc existente, todo lo que tienes que hacer es:

  1. Agregar GlobalConfiguration.Configuration.EnsureInitialized (); al final de su método Application_Start .

O

  1. Mueva toda su configuración en una sola llamada a GlobalConfiguration.Configure :
 GlobalConfiguration.Configure(config => { WebApiConfig.Register(config); config.MapAttributeRoutes(); ... }); 

Cavar más profundo

HttpConfiguration.Configuration tiene una propiedad “Initializer” definida así:

 public Action Initializer; 

HttpConfiguration.EnsureInitialized () ejecuta esta acción y establece _initialized en true

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

HttpConfiguration.MapAttributeRoutes llama al método interno AttributeRoutingMapper.MapAttributeRoutes que establece 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 ejecuta EnsureInitialized inmediatamente después de invocar su acción:

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

No lo olvide, si se ejecuta en una pared, la fuente de asp.net está disponible en http://aspnetwebstack.codeplex.com/SourceControl/latest

He tenido un problema relacionado. En ocasiones, al llamar a GlobalConfiguration.Configure varias veces se desencadena este error. Como solución, puse toda la lógica de inicialización de configuración en un solo lugar.

Para mí, el problema era que estaba tratando de usar parámetros con nombre para campos de cadena de consulta en mis rutas:

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

Los campos de cadena de consulta se asignan automáticamente a los parámetros y no son realmente parte de la definición de ruta. Esto funciona:

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

Aunque la respuesta anterior funciona si en caso de que no esté configurada, en mi caso esto ya estaba configurado. Lo que era diferente era que, para una de las API que había escrito, había prefijado la ruta con un /. Ejemplo

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

.Cambiando esto a

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

me lo arregló

Recibí este error cuando la versión de Newtonsoft.Json era diferente en mi proyecto principal en comparación con el proyecto de ayuda

SI ESTE ERROR PARECE HABER SALIDO “de NOWHERE” , es decir, su aplicación funcionaba perfectamente bien por un tiempo, pregúntese: ¿He agregado una acción a un controlador o cambio alguna ruta antes de ver este error?

Si la respuesta es sí (y probablemente lo sea), es probable que haya cometido un error en el proceso. El formateo incorrecto, copiar / pegar una acción y olvidarse de asegurarse de que los nombres de los puntos finales sean únicos, etc., lo terminarán aquí arriba. La sugerencia que hace este error sobre cómo resolverlo puede hacerte ladrar al árbol equivocado.

Llamada

 GlobalConfiguration.Configuration.MapHttpAttributeRoutes(); 

antes de

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

completa su ejecución.

Uno normalmente obtiene esta excepción cuando las plantillas de ruta en “Enrutamiento de atributos” no son adecuadas.

Por ejemplo, obtuve esto cuando escribí el siguiente código:

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

En la syntax de restricciones de ruta {parameter: constraint}, la restricción por defecto es de tipo string . No es necesario mencionarlo explícitamente.

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

Empecé a recibir este error un día. Después de haber modificado nuestra aplicación para llamar a EnsureInitialized() , pude ver la causa raíz.

Tenía un atributo personalizado, un filtro, en una acción. Esa clase de atributo tuvo un cambio radical en el paquete NuGet en el que vive.

Aunque actualicé el código y todo se compiló, el trabajador local de IIS estaba cargando una DLL anterior y no encontró un miembro de la clase durante la inicialización, leyendo atributos en acciones, etc.

Por alguna razón (posiblemente debido a un pedido / cuando nuestro inicio de sesión se inicializó), este error no fue detectable, posiblemente dejando el WebAPI en un estado extraño, hasta que agregué EnsureInitialized() que capturó la excepción y salió a la superficie.

Se resolvió la ejecución de un bin apropiado y obj clean a través de una práctica secuencia de comandos.