什么是Global.asax ASP.Net Web API中的GlobalConfiguration.Configuration.EnsureInitialized()

Mal*_*lil 7 .net asp.net-mvc asp.net-mvc-4 asp.net-web-api asp.net-web-api2

在我的WebApi项目下,我不知道这行在 Global.asax方法中GlobalConfiguration.Configuration.EnsureInitialized()做了什么.如果没有这个,即使每件事都很好.那么为什么这样呢? Application_Start()

有必要来这儿吗?如果是,那为什么呢?任何人都可以详细解释其需要和目的.

protected void Application_Start()
{   
    AreaRegistration.RegisterAllAreas();
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);

    ////////////      What is this for   ////////////////
    GlobalConfiguration.Configuration.EnsureInitialized();
}
Run Code Online (Sandbox Code Playgroud)

不是重复:堆栈溢出很多人建议使用EnsureInitialized().但为什么要使用它?它来自哪里?它是webApi2的一部分还是其他什么?这些是我想知道的事情.MSDN本身没有解释.

Nig*_*888 5

每个MSDN

HttpConfiguration.EnsureInitialized方法

调用Intializer挂钩。从现在开始,它被认为是不变的。多次调用是安全的。

更多信息

正如该答案所指出的,由于更改了Web API v1与Web API v2中应该注册Web API的方式,因此可能将其放入您的应用程序中。

升级Web API后未进行任何更改的任何人都将收到错误消息:

该对象尚未初始化。确保在所有其他初始化代码之后,在应用程序的启动代码中调用HttpConfiguration.EnsureInitialized()

不幸的是,错误消息中给出的解决方案具有误导性。你所真正应该改变,而从V1升级是替代这一行:

WebApiConfig.Register(GlobalConfiguration.Configuration);
Run Code Online (Sandbox Code Playgroud)

用这一行:

GlobalConfiguration.Configure(WebApiConfig.Register);
Run Code Online (Sandbox Code Playgroud)

后一种方法在内部调用,EnsureInitialized因此您不必从启动代码开始。

我注意到您的配置中没有这两个Web Api初始化程序,因此我建议您按以下方式更改启动方式:

protected void Application_Start()
{   
    AreaRegistration.RegisterAllAreas();
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    GlobalConfiguration.Configure(WebApiConfig.Register);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
}
Run Code Online (Sandbox Code Playgroud)