确保 HttpConfiguration.EnsureInitialization()

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

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

怎么办?

    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

这是 校友云

83729 次浏览

请参阅@詹蒂安的回答如下了解现在处理这个问题的正确方法。

Global.Asax.cs中的 Application_Start方法的末尾,尝试添加:-

GlobalConfiguration.Configuration.EnsureInitialized();

如果您在 Application _ Start 的末尾执行此操作,那就太晚了,因为已经调用了 WebApiConfig.Register。

解决这个问题的最佳方法是使用新的初始化方法,在 Global.asax 中替换:

WebApiConfig.Register(GlobalConfiguration.Configuration);

作者

GlobalConfiguration.Configure(WebApiConfig.Register);

我有一个相关的问题。有时多次调用 GlobalConfiguration.Configure会触发此错误。作为解决方案,我将所有配置初始化逻辑放在一个地方。

GlobalConfiguration.Configuration.MapHttpAttributeRoutes();

之前

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

完成它的执行。

当我在 WebApi 中使用 Attribute Routing 时,我实际上得到了这个错误。

是的

[路线(“ webapi/siteTypes/{ siteTypeId”)]

而不是

[路线(“ webapi/siteTypes/{ siteTypeId }”)]

我的路线和得到这个错误。我只是错过了结尾的花括号。一旦我把它添加回去,这个错误就不会再发生了。

对我来说,问题在于我试图在路由中对查询字符串字段使用命名参数:

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

查询字符串字段会自动映射到参数,而不是路由定义的一部分:

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

这是旧的,但是是在谷歌搜索这个错误的第一个结果。经过一番深入调查,我终于明白发生了什么事。

第三季:
GlobalConfiguration 配置所做的就是调用您的操作并调用 确保初始化()。必须在 确保初始化()之前调用 MapAttributeRoutes (),因为 EnsureInitialization 只运行一次。

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

  1. 配置。确保初始化() ;应用程序 _ 开始方法的底部。

或者

  1. 将整个配置移动到一个对 GlobalConfiguration 配置的调用中:
GlobalConfiguration.Configure(config =>
{
WebApiConfig.Register(config);
config.MapAttributeRoutes();
...
});

深入挖掘

Configuration 有一个“ Initializer”属性定义如下:

public Action<HttpConfiguration> Initializer;

EnsureInitialization () 运行此操作并将 _ 初始化设置为 < em > true

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

MapAttributeRoutes 调用内部方法 属性路由器,该方法设置 < strong > 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);
...
};
}

配置 在调用操作后立即运行 确保初始化:

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上找到

有一天我开始得到这个错误。在我更改了我们的应用程序调用 EnsureInitialized()之后,我能够看到根本原因。

我在一个操作上有一个自定义属性,一个过滤器。该属性类在其所在的 NuGet 包中发生了重大更改。

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

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

通过一个方便的脚本执行适当的 binobj清理解决了这个问题。

我得到这个错误时,版本的 Newtonsoft。与 helper 项目相比,我的主项目中的 Json 是不同的

当“属性路由”中的路由模板不正确时,通常会出现此异常。

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

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

在路由约束语法{參數: 約束}中,缺省的約束是 绳子型。不需要明示地提及它。

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

虽然上面的答案工作,如果没有设置,在我的情况下,这个东西已经设置。不同之处在于,对于我编写的一个 API,我在路由前面加了一个/。例子

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

。改变这个

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

帮我修好了

如果这个错误似乎是“凭空出现的”,也就是说,你的应用程序在一段时间内工作得非常好,问问你自己: 在看到这个错误之前,我是否向控制器添加了一个动作或者改变了任何路由?

如果答案是肯定的(而且很可能是肯定的) ,那么您可能在这个过程中犯了一个错误。不正确的格式、复制/粘贴操作以及忘记确保端点名称是唯一的等等都会在这里结束。关于如何解决这个错误的建议可能会让你找错方向。

在我的例子中,我在项目 A 中创建了 webservice,并从项目 B 开始,我得到了这个错误。问题是。在 B 的 build-output-文件夹中缺少 A 所需要的 dll-files。可用 dll 文件修复它。

在我的例子中,我使用了一个 Entity 作为操作的参数,它的“ Schema”丢失了。

错误的属性:

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

正确:

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

在我的情况下,我修正了替换:

<Route("{id:string}")>

<Route("{id}")>

奇怪的是,我确信原始代码在突然停止工作之前,去图... 。

我也经历过类似的错误。

<Error>
<Message>An error has occurred.</Message>
<ExceptionMessage>The object has not yet been initialized. Ensure that HttpConfiguration.EnsureInitialized() is called in the application's startup code after all other initialization code.</ExceptionMessage>
<ExceptionType>System.InvalidOperationException</ExceptionType>
<StackTrace> at System.Web.Http.Routing.RouteCollectionRoute.get_SubRoutes() at System.Web.Http.Routing.RouteCollectionRoute.GetRouteData(String virtualPathRoot, HttpRequestMessage request) at System.Web.Http.WebHost.Routing.HttpWebRoute.GetRouteData(HttpContextBase httpContext)</StackTrace>
</Error>

把玩了一会儿之后,我意识到了两个问题: 目录名与路由前缀冲突路由前缀不能以“/”结尾。在启动服务进行调试时,我在添加 samplecontroller.cs 后得到了这个浏览器错误。

文件夹结构

  /api/Controllers/SampleController.cs
/api/Model/...

Samplecontroller.cs

[RoutePrefix("api/sub/{parameterId}/more/")]
public class SampleController : ApiController
{
[HttpGet]
[Route("")]
public IHttpActionResult Get(int parameterId)
{
return Ok("Knock Knock...");
}
}


将路由前缀更改为不以’/’结尾,并且不与目录名冲突,解决了这个问题。