Asegúrese de que HttpConfiguration.EnsureInitialized ()

142

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

Llenar la pila es lo que hago
fuente

Respuestas:

141

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

Al final del Application_Startmétodo, Global.Asax.csintente agregar: -

GlobalConfiguration.Configuration.EnsureInitialized(); 
Ian Mercer
fuente
3
Estaba recibiendo esta respuesta, así que comparé mi proyecto que se generó a partir de una versión preliminar de VS 2013 con uno que se generó con la Actualización 1 y la diferencia es que reemplazaron WebApiConfig.Register (...) con GlobalConfiguration.Configure (. ..) como gentiane describe en su respuesta. Esto resuelve el problema.
Bryan Bedard
1
Eso es exactamente lo GlobalConfiguration.Configure(Action<HttpConfiguration> configurationCallback)que llamará después de la configuración Callback.
cmxl
44
El error también puede ocurrir cuando la configuración de DI se realiza antes de GlobalConfiguration.Configure (WebApiConfig.Register); llamada
Silvos
Gracias. Esa ha sido una espina en mi costado.
Robert Bolton
241

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

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

WebApiConfig.Register(GlobalConfiguration.Configuration);

por

GlobalConfiguration.Configure(WebApiConfig.Register);
gentiane
fuente
12
Según la documentación de Microsoft, esta debería ser la forma correcta de hacerlo. asp.net/web-api/overview/web-api-routing-and-actions/…
Dalorzo
He estado migrando una aplicación mvc, cuando las rutas de la API no funcionaban, agregué esto y MapHttpAttributeRoutes lo trajo todo a la vida.
Phil Cooper
1
Esta respuesta me lo arregló.
GiddyUpHorsey
Pero, ¿qué pasa si tiene una clase no estática WebApiConfig?
Georgy Grigoryev
@GeorgyGrigoryev: puedes crear una instancia dentro de la acción de esta manera:GlobalConfiguration.Configure(config => new WebApiConfig().Register(config));
cmxl
69

En realidad, recibí este error cuando estaba usando el enrutamiento de atributos dentro de mi WebApi.

yo tenía

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

en vez de

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

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

Jeff Yates
fuente
23
También tuve este problema cuando puse el prefijo de la ruta con una barra diagonal [Ruta ("/ api /"]) en lugar de [Ruta ("api")]
cguedel
1
{int: id} en lugar de {id: int}
Marat Batalandabad
1
Este me atrapa todo el tiempo, pero solía dar un error diferente. Después de actualizar a Visual Studio 2015 y .Net 4.6, aparece este error.
nbering
77
Mi error fue [Ruta ("api / {parámetro: cadena}")] en lugar de [Ruta ("api / {parámetro}")]. Aparentemente, poner: string como tipo es incorrecto, ya que es el predeterminado.
Jamby
1
Similar a Jamby, mi error fue que necesitaba: [Route ("api / ObjectOfInterest / {type} / {name}")] ... pero: [Route ("api / ObjectOfInterest / {type: string} / {name : string} ")] // WRONG ... no estaba funcionando. Sé que es extraño que necesite un parámetro llamado 'Tipo' que sea una cadena (y no un System.Type) ... pero eliminó la especificación de la cadena y funciona bien.
Aidanapword
31

Esto es antiguo, pero es el primer resultado en Google al buscar este error. Después de un poco de excavación pude averiguar qué estaba pasando.

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

Significado: si viene de un proyecto Mvc existente, todo lo que tiene que hacer es:

  1. Añadir 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<HttpConfiguration> 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<HttpConfiguration> previousInitializer = configuration.Initializer;
    configuration.Initializer = config =>
    {
        previousInitializer(config);
        ...
    };
}

GlobalConfiguration.Configure ejecuta GuaranteeInitialized inmediatamente después de invocar su acción:

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

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

No olvide que si se encuentra con un muro, la fuente de asp.net está disponible en http://aspnetwebstack.codeplex.com/SourceControl/latest

tField
fuente
La solución con una sola llamada a GlobalConfiguration.Configure me salvó la vida. Tuve problemas con el enrutamiento basado en atributos y la configuración DI junto con el orden correcto de invocar las configuraciones. También utilizo MS ApiVersioning, donde necesitaba las inyecciones DI antes de que la primera ruta alcanzara los atributos de control de versiones. Muchas
gracias
12

He tenido un problema relacionado. A veces llamandoGlobalConfiguration.Configure varias veces desencadena este error. Como solución alternativa, he puesto toda la lógica de inicialización de configuración en un solo lugar.

Gleno
fuente
Sí, este fue definitivamente el problema en mi caso
Obi
¡Gracias! Este fue exactamente mi problema.
Søren Boisen
Mismo problema aquí! He estado tratando de solucionar el problema durante un par de horas, por lo que la x para el comentario.
Sc0tTy
7

Para mí, el problema era que estaba tratando de usar parámetros con nombre para los 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 en realidad no forman parte de la definición de ruta. Esto funciona:

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

Aunque la respuesta anterior funciona si no está configurado en caso, en mi caso ya está 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ó

El servidor 0
fuente
@Svend hecho. Parecía una estupidez, pero parece que ese es el problema en bastantes casos. : P
The 0bserver
@ The0bserver esto también funcionó para mí. Era difícil de diagnosticar debido a que en la parte superior de mi clase controlador que tenía una HttpPrefixdecoradora y luego para mi punto final individuo que tenía el decorador: [Route("/")]. Simplemente pasando una cadena vacía en la ruta se solucionó el problema.
David
1
Me alegro de que haya ayudado. :)
The 0bserver
7

SI ESTE ERROR PARECE HABER SALIDO "DE NINGUNA PARTE" , es decir, su aplicación funcionó perfectamente bien durante un tiempo, pregúntese: ¿Agregué una acción a un controlador o cambié 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 punto final sean únicos, etc., todo lo terminará aquí. La sugerencia que hace este error sobre cómo resolverlo puede enviarle a ladrar al árbol equivocado.

Byron Jones
fuente
Esto es exactamente lo que me pasó. Cambié una ruta pero había dejado una llave errónea al final como esta: [Ruta ("GetStuff}")]
Precio de Stu
2

Llamada

GlobalConfiguration.Configuration.MapHttpAttributeRoutes();

antes de

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

completa su ejecución

abatishchev
fuente
2

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

David Lilljegren
fuente
Adición rápida: asegúrese de limpiar su solución después de solucionar el problema de referencia y verifique que la DLL implementada final sea la versión correcta :)
Marcel
1

Normalmente, se 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 sintaxis de restricciones de ruta {parámetro: restricción}, la restricción por defecto es de tipo cadena . No es necesario mencionarlo explícitamente.

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

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

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

Aunque había actualizado el código y todo estaba compilado, el trabajador local de IIS estaba cargando una DLL antigua y no encontraba un miembro de la clase durante la inicialización, leía los atributos de las acciones, etc.

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

Realizar un correcto biny objlimpio a través de un script útil lo resolvió.

Luke Puplett
fuente
0

En mi caso, creé el servicio web en el proyecto A y lo inicié desde el Proyecto B y obtuve exactamente este error. El problema era que algunos archivos .dll requeridos por A faltaban en la carpeta de salida de compilación de B. Asegúrese de que estos archivos .dll estén disponibles lo arreglaron.

anión
fuente
0

En mi caso, utilicé una Entidad como parámetro de mi acción que falta su 'Esquema'.

Atributo incorrecto:

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

Correcto:

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