确保HttpConfiguration.EnsureInitialized()

我已经安装了Visual Studio 2013,当我运行我的应用程序,我得到下面的错误。

我不知道我在哪里初始化这个对象。

该怎么办?

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 

这是AlumCloud的

看看@ gentaine的答案是正确的方式来处理这个现在。

Global.Asax.cs中的Application_Start方法的Global.Asax.cs尝试添加: –

 GlobalConfiguration.Configuration.EnsureInitialized(); 

如果您在Application_Start结束时执行该操作,则已经太晚了,因为WebApiConfig.Register已被调用。

解决这个问题的最好方法是通过replaceGlobal.asax来使用新的初始化方法:

 WebApiConfig.Register(GlobalConfiguration.Configuration); 

通过

 GlobalConfiguration.Configure(WebApiConfig.Register); 

当我在WebApi中使用属性路由时,我实际上遇到了这个错误。

我有

〔路线( “的WebAPI / siteTypes / {siteTypeId”]

代替

〔路线( “的WebAPI / siteTypes / {siteTypeId}”]

为我的路线,并得到了这个错误。 我只是错过了最后的大括号。 一旦我加回来,这个错误不会再发生。

这是旧的,但是在search这个错误时,谷歌的第一个结果。 经过相当多的挖掘,我能够弄清楚发生了什么事情。

tldr:
所有的GlobalConfiguration.Configure都会调用你的动作并调用EnsureInitialized() 必须在EnsureInitialized()之前调用config.MapAttributeRoutes(),因为EnsureInitialized只运行一次。

意思是:如果你来自现有的Mvc项目,你所要做的就是:

  1. 添加GlobalConfiguration.Configuration.EnsureInitialized(); 到你的Application_Start方法的底部。

要么

  1. 将您的整个configuration移到GlobalConfiguration.Configure的单个调用中:
 GlobalConfiguration.Configure(config => { WebApiConfig.Register(config); config.MapAttributeRoutes(); ... }); 

深层发掘

HttpConfiguration.Configuration具有如下定义的“Initializer”属性:

 public Action<HttpConfiguration> Initializer; 

HttpConfiguration.EnsureInitialized()运行此操作并将_initialized设置为true

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

HttpConfiguration.MapAttributeRoutes调用内部方法AttributeRoutingMapper.MapAttributeRoutes设置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调用您的操作后立即运行EnsureInitialized

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

不要忘记,如果你跑到墙上,asp.net的源代码可以在http://aspnetwebstack.codeplex.com/SourceControl/latest

我有一个相关的问题。 有时多次调用GlobalConfiguration.Configure会触发这个错误。 作为一种解决方法,我把所有的configuration初始化逻辑放在一个地方。

对我来说,问题是我试图在我的路线中使用命名参数查询string字段:

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

查询string字段自动映射到参数,实际上不是路由定义的一部分。 这工作:

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

我得到这个错误时,我的主要项目中的Newtonsoft.Json的版本不同于帮助程序项目

呼叫

 GlobalConfiguration.Configuration.MapHttpAttributeRoutes(); 

之前

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

完成执行。

当“属性路由”中的路由模板不正确时,通常会得到此exception。

例如,当我写下面的代码时,我得到了这个:

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

在路由约束语法{参数:约束}中,默认的约束是stringtypes。 没有必要明确提及它。

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

有一天我开始犯这个错误。 在我修改我们的应用程序调用EnsureInitialized()我能够看到根本原因。

我有一个自定义的属性,一个filter,在一个行动。 该属性类在其所在的NuGet包中进行了重大更改。

即使我已经更新了代码并将其全部编译完成,本地IIS工作者正在加载一个旧的DLL,并且在初始化过程中没有find一个类成员,读取操作的属性等。

出于某种原因(可能是由于命令/当我们的日志logging被初始化),这个错误是不可发现的,可能会使WebAPI处于一个奇怪的状态,直到我添加了EnsureInitialized() ,它捕获了exception并将其浮出水面。

通过一个方便的脚本执行一个正确的binobj清理解决它。

虽然上面的答案是有效的,如果没有设置,在我的情况这个东西已经设置。 不同的是,对于我写的API之一,我已经用/来为路由加上前缀。 例

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

改变这个

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

给我修好了