确保HttpConfiguration.EnsureInitialized()


142

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

Answers:


141

请参阅下面的 @ gentiane答案,以了解现在处理此问题的正确方法。

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

GlobalConfiguration.Configuration.EnsureInitialized(); 

3
我得到了这个答案,所以我将从VS 2013预览版生成的项目与由Update 1生成的项目进行了比较,不同之处在于它们将WebApiConfig.Register(...)替换为GlobalConfiguration.Configure(。 ..)就像金刚烷在他们的回答中所述。这确实解决了问题。
Bryan Bedard 2014年

1
这就是GlobalConfiguration.Configure(Action<HttpConfiguration> configurationCallback)在configurationCallback之后将要调用的内容。
cmxl

4
当在GlobalConfiguration.Configure(WebApiConfig.Register);之前完成DI配置时,也会发生错误。电话
Silvos

谢谢。那是我这边的荆棘。
罗伯特·博尔顿

241

如果您在Application_Start的末尾执行此操作,那将为时已晚,因为已调用WebApiConfig.Register。

解决此问题的最佳方法是通过替换Global.asax来使用新的初始化方法:

WebApiConfig.Register(GlobalConfiguration.Configuration);

通过

GlobalConfiguration.Configure(WebApiConfig.Register);

12
根据Microsoft文档,这应该是正确的方法。asp.net/web-api/overview/web-api-routing-and-actions/...
Dalorzo

我一直在迁移一个mvc应用程序,当api路由不起作用时,添加它,然后MapHttpAttributeRoutes使其全部变为现实。
Phil Cooper

1
这个答案为我解决了。
GiddyUpHorsey 2014年

但是,如果您有WebApiConfig非静态类怎么办?
乔治·格里戈里耶夫

@GeorgyGrigoryev:您可以像这样在动作内部实例化它:GlobalConfiguration.Configure(config => new WebApiConfig().Register(config));
cmxl

69

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

我有

[Route(“ webapi / siteTypes / {siteTypeId”]

代替

[Route(“ webapi / siteTypes / {siteTypeId}”]

我的路线,并收到此错误。我只是错过了大括号。一旦将其重新添加,便不再发生此错误。


23
当我给路径加上斜线[Route(“ / api /”])而不是[Route(“ api”)]时,我也遇到了这个问题
cguedel 2015年

1
{int:id}而非{id:int}
Marat Batalandabad

1
这总是让我感到困惑,但它经常会带来另一个错误。升级到Visual Studio 2015和.Net 4.6后,出现此错误。
nbering

7
我的错误是[Route(“ api / {parameter:string}”)]而不是[Route(“ api / {parameter}”))]。显然,将:string设置为类型是错误的,因为它是默认设置。
Jamby

1
与Jamby相似,我的错误是我需要:[Route(“ api / ObjectOfInterest / {type} / {name}”)] ...但是:[Route(“ api / ObjectOfInterest / {type:string} / {name :string}“)] //错误...无效。我知道我需要一个名为'Type'的参数是一个字符串(而不是System.Type)是很奇怪的,但是删除了字符串规范,它可以正常工作。
Aidanapword

31

这很旧,但是搜索此错误时,这是​​google上的第一个结果。经过大量的挖掘,我能够弄清楚发生了什么。

tldr:
所有GlobalConfiguration.Configure所做的只是调用您的操作并调用sureInitialized()config.MapAttributeRoutes()之前必须叫EnsureInitialized()因为EnsureInitialized只运行一次。

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

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

要么

  1. 将整个配置移到对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在调用您的操作后立即运行确保初始化

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即可解决该问题,从而挽救了我的生命。我在基于属性的路由和DI配置以及调用配置的正确顺序方面遇到问题。我还使用MS ApiVersioning,在这里我需要在第一个路由到达版本控制属性之前进行DI注入。非常
感谢

12

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


是的,这绝对是我的问题
Obi,2015年

谢谢!这正是我的问题。
索伦Boisen

同样的问题在这里!试图解决此问题已有几个小时,因此请以x开头。
Sc0tTy

7

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

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

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

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

7

尽管如果未设置incase则上述答案有效,但就我而言,此材料已设置好。所不同的是,对于我编写的一个API,我给路由添加了/前缀。例

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

更改为

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

为我修复


@Svend确实。看起来像个愚蠢的事情,但是在很多情况下这就是问题所在。:P
0bserver

@ The0bserver这也为我工作。这很难诊断,因为在控制器类的顶部,我有一个HttpPrefix装饰器,然后对于我的单个端点,我有装饰器:[Route("/")]。通过在路由中简单地传递一个空String即可解决此问题。
戴维

1
很高兴它有所帮助。:)
0bserver

7

如果此错误项“突然出现”,即您的应用程序运行良好一段时间,请问自己:在看到此错误之前,我是否向控制器添加了动作或更改了任何路由?

如果答案是肯定的(可能是),则您可能在此过程中犯了一个错误。错误的格式,复制/粘贴操作以及忘记确保端点名称唯一等都将使您到此为止。关于此错误的解决方法的建议可能使您发出错误的建议。


这正是我发生的事情。我更改了一条路线,但是在末端留下了错误的花括号,如下所示:[Route(“ GetStuff}”)]
Stu Price

2

呼叫

GlobalConfiguration.Configuration.MapHttpAttributeRoutes();

之前

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

完成其执行。


2

当Newtonsoft.Json的主项目版本与帮助程序项目不同时,出现此错误


快速添加:确保在解决了参考问题之后清理您的解决方案,并仔细检查最终部署的DLL是否是正确的版本:)
Marcel

1

当“属性路由”中的路由模板不合适时,通常会发生此异常。

例如,我在编写以下代码时得到了此代码:

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

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

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

0

我有一天开始收到此错误。在更改了我们的应用程序后,EnsureInitialized()我可以看到根本原因了。

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

即使我更新了代码并进行了全部编译,本地IIS工作人员仍在加载旧的DLL,并且在初始化期间未找到类成员,无法读取操作的属性等。

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

通过方便的脚本执行适当binobj干净的操作可以解决该问题。


0

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


0

就我而言,我使用Entity作为其“架构”缺失的操作的参数。

属性错误:

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

正确的:

[Table("Table name", Schema = "schema name")]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.