【问题标题】:Why do I get an InvalidOperationException when I try to use attribute routing with Web API 2?当我尝试将属性路由与 Web API 2 一起使用时,为什么会收到 InvalidOperationException?
【发布时间】:2013-11-03 17:32:48
【问题描述】:

我刚刚在我的 MVC 4 应用程序中更新了我的 Web API 包,以便我可以使用属性路由。当我添加 config.MapHttpAttributeRoutes() 时,我收到一条错误消息:“对象尚未初始化。确保在所有其他初始化代码之后在应用程序的启动代码中调用 HttpConfiguration.EnsureInitialized()。” em> 如果我删除 config.MapHttpAttributeRoutes() 和 Route 属性,一切都会像以前一样工作。如何解决此错误?

这是我的 WebApiConfig 类:

public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {

            config.MapHttpAttributeRoutes();
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );



            // Uncomment the following line of code to enable query support for actions with an IQueryable or IQueryable<T> return type.
            // To avoid processing unexpected or malicious queries, use the validation settings on QueryableAttribute to validate incoming queries.
            // For more information, visit http://go.microsoft.com/fwlink/?LinkId=279712.
            //config.EnableQuerySupport();
        }
    }

以及错误详情:

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

说明:在执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.InvalidOperationException:对象尚未初始化。确保 HttpConfiguration.EnsureInitialized() 在所有其他初始化代码之后在应用程序的启动代码中被调用。

来源错误:

在执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常来源和位置的信息。

堆栈跟踪:

[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() +127
   System.Web.Http.Routing.RouteCollectionRoute.GetRouteData(String virtualPathRoot, HttpRequestMessage request) +99
   System.Web.Http.WebHost.Routing.HttpWebRoute.GetRouteData(HttpContextBase httpContext) +191
   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

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-4 asp.net-web-api


    【解决方案1】:

    在 Global.asax 中,Application_Start 事件需要从

    WebApiConfig.Register(GlobalConfiguration.Configuration);
    

    到:

    GlobalConfiguration.Configure(WebApiConfig.Register);
    

    【讨论】:

    • 这种新的“反转”是否适用于FilterConfig.RegisterGlobalFilters()RouteConfig.RegisterRoutes()BundleConfig.RegisterBundles()
    • @ScottSEA - 过滤器、路由和捆绑配置是特定于 MVC 的,而这里的主题是 WebAPI。在配置方面,它们是完全不同的野兽。
    • @PeterLillevold - 感谢您的澄清
    • 为了更清楚为什么这是解决方案,有人可以解释为什么这会改变吗?
    • 先生,您真是个天才
    【解决方案2】:

    注释掉或删除WebApiConfig中的这行代码:

    config.MapHttpAttributeRoutes();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-11
      • 2017-09-19
      • 2017-03-24
      • 2015-03-19
      • 1970-01-01
      相关资源
      最近更新 更多