152

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

4

16 回答 16

247

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

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

WebApiConfig.Register(GlobalConfiguration.Configuration);

经过

GlobalConfiguration.Configure(WebApiConfig.Register);
于 2014-01-04T22:26:17.747 回答
149

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

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

GlobalConfiguration.Configuration.EnsureInitialized(); 
于 2013-11-14T06:07:53.207 回答
76

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

我有

[Route("webapi/siteTypes/{siteTypeId"]

代替

[Route("webapi/siteTypes/{siteTypeId}"]

对于我的路线并收到此错误。我只是错过了结束大括号。一旦我重新添加它,这个错误就没有再次发生。

于 2015-01-21T11:13:08.307 回答
33

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

tldr:
GlobalConfiguration.Configure所做的只是调用您的操作并调用EnsureInitialized()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在调用您的操作后立即运行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找到

于 2015-12-17T01:15:23.637 回答
12

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

于 2014-03-17T16:51:31.587 回答
7

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

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

于 2018-06-11T13:09:20.023 回答
7

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

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

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

[Route("my-route")]
public void MyRoute([FromUri] string field)
{
}
于 2015-08-20T22:15:47.037 回答
7

虽然上面的答案在没有设置的情况下有效,但在我的情况下,这些东西已经设置好了。不同的是,对于我编写的其中一个 API,我为路由添加了前缀 / 。例子

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

.将其更改为

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

为我修好了

于 2017-08-18T07:31:05.047 回答
3

称呼

GlobalConfiguration.Configuration.MapHttpAttributeRoutes();

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

完成其执行。

于 2014-06-30T19:48:48.860 回答
2

当我的主项目中的 Newtonsoft.Json 版本与辅助项目不同时,我收到此错误

于 2017-03-17T18:15:48.807 回答
1

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

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

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

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

[Route("{dirName}/contents")] //correct
public HttpResponseMessage GetDirContents(string dirName) { ... }
于 2017-08-03T12:39:35.627 回答
0

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

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

即使我更新了代码并全部编译,本地 IIS 工作人员正在加载一个旧的 DLL,并且在初始化期间没有找到类成员,读取动作的属性等。

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

通过一个方便的脚本执行正确bin和清洁解决了它。obj

于 2016-03-23T14:58:57.843 回答
0

我遇到了类似的错误。

<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/...

示例控制器.cs

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

将路由前缀更改为不以“/”结尾并且不与目录名称冲突解决了该问题。

于 2021-10-13T06:15:02.993 回答
0

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

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

<Route("{id}")>

奇怪的是,在突然停止之前,我确定原始代码正在工作,去看看....

于 2021-02-26T00:45:01.003 回答
0

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

错误的属性:

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

正确的 :

[Table("Table name", Schema = "schema name")]
于 2020-04-11T22:22:22.367 回答
0

在我的情况下,我在项目 A 中创建了 web 服务并从项目 B 启动它,我得到了这个错误。问题是 A 需要的一些 .dll 文件在 B 的构建输出文件夹中丢失。确保这些 .dll 文件可用修复它。

于 2019-09-19T14:29:37.957 回答