确保HttpConfiguration.EnsureInitialized()

时间:2013-11-14 03:52:27

标签: c# .net asp.net-mvc-routing

我已经安装了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

15 个答案:

答案 0 :(得分:225)

如果你在Application_Start结束时这样做,那就太晚了,因为已经调用了WebApiConfig.Register。

解决此问题的最佳方法是通过替换Global.asax:

来使用新的初始化方法
WebApiConfig.Register(GlobalConfiguration.Configuration);

通过

GlobalConfiguration.Configure(WebApiConfig.Register);

答案 1 :(得分:135)

请参阅@ gentiane's answer below了解正确处理此问题的方法。

Application_Start Global.Asax.cs方法的最后,尝试添加: -

GlobalConfiguration.Configuration.EnsureInitialized(); 

答案 2 :(得分:65)

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

我有

  

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

而不是

  

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

我的路线并得到了这个错误。我只是错过了最后的花括号。一旦我将其重新添加,就不会再出现此错误。

答案 3 :(得分:29)

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

  

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

含义:如果您来自现有的Mvc项目,您所要做的就是:

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

OR

  
      
  1. 将整个配置移至 GlobalConfiguration.Configure 的单次调用中:
  2.   
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

获取

答案 4 :(得分:12)

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

答案 5 :(得分:7)

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

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

查询字符串字段自动映射到参数,实际上不是路径定义的一部分。这有效:

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

答案 6 :(得分:4)

虽然上面的答案可以解决,如果没有设置,在我的情况下这个东西已经设置好了。不同的是,对于我编写的一个API,我使用/为前缀添加了路径。示例

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

。将此更改为

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

为我修好了

答案 7 :(得分:3)

如果这个错误似乎已经来了,那么你的应用程序在一段时间内工作得非常好,请问自己:我是否向控制器添加了一个动作或在看到此错误之前更改任何路线?

如果答案是肯定的(可能是),那么你可能在这个过程中犯了一个错误。格式不正确,复制/粘贴操作并忘记确保端点名称是唯一的等等都将在此结束。这个错误如何解决它的建议可能会让你咆哮错误的树。

答案 8 :(得分:2)

呼叫

GlobalConfiguration.Configuration.MapHttpAttributeRoutes();

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

完成执行。

答案 9 :(得分:2)

当我的主项目中的Newtonsoft.Json版本与帮助程序项目相比时出现此错误

答案 10 :(得分:1)

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

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

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

在路径约束语法{parameter:constraint}中,默认情况下约束的类型为 string 。无需明确提及。

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

答案 11 :(得分:0)

有一天我开始收到这个错误。在我改变我们的应用程序以致电EnsureInitialized()后,我能够看到根本原因。

我在动作上有自定义属性,过滤器。该属性类在它所居住的NuGet包中进行了重大改变。

即使我已经更新了代码并且所有代码都已编译,但本地IIS工作者正在加载旧的DLL而不是在初始化期间找到类成员,在操作上读取属性等。

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

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

答案 12 :(得分:0)

在我的情况下,我在项目A中创建了Web服务,并从项目B中启动了该服务,而我恰好收到了此错误。问题是A所需的某些.dll文件在B的build-output-folder中丢失。请确保这些.dll文件可用,可以修复它。

答案 13 :(得分:0)

在我的情况下,我使用Entity作为其“架构”缺失的操作的参数。

错误的属性:

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

正确:

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

答案 14 :(得分:0)

就我而言,我修复了替换:

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

<Route("{id}")>

奇怪的是,在突然停止之前,我确定原始代码是有效的,去图....