8

在带有 Web API 的 MVC 5 上,我有以下内容,仅使用属性路由:

RouteTable.Routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
RouteTable.Routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.([iI][cC][oO]|[gG][iI][fF])(/.*)?" }); // TODO: Check for Apple Icons

RouteTable.Routes.MapMvcAttributeRoutes();
GlobalConfiguration.Configuration.MapHttpAttributeRoutes();
AreaRegistration.RegisterAllAreas();

在 RouteTable 中创建了所有 MVC 路由……但不是 API 路由……

我检查了 RouteTable.Routes 并看到了一个异常:

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

在 System.Web.Http.Routing.RouteCollectionRoute.get_SubRoutes() 在 System.Web.Http.Routing.RouteCollectionRoute.GetEnumerator() 在 System.Linq.SystemCore_EnumerableDebugView`1.get_Items()

为了测试这一点,我只在项目中添加了两个 Web Api 操作:

[RoutePrefix("api")]
public class StatApiController : ApiController {

  [Route("stats/notescreateddaily"), HttpGet]
  public IHttpActionResult NotesCreatedDaily() {
    // Some code
  }

  [Route("stats/userscreateddaily"), HttpGet]
  public IHttpActionResult UsersCreatedDaily() {
    // Some code
  }

}

我错过了什么吗?

谢谢你,米格尔

4

3 回答 3

19

解决方案实际上是替换:

GlobalConfiguration.Configuration.MapHttpAttributeRoutes();

经过:

GlobalConfiguration.Configure(x => x.MapHttpAttributeRoutes());

这是 Web API 2 中的一个变化。

于 2013-11-09T20:12:39.690 回答
1

在使用 ASP.Net Web API 4.0 到 4.5 并使用带有 Cors 库的 Web API 2.2 将所有 Web 服务项目升级后,我遇到了同样的问题。我设法成功地解决了这个问题。我所做的是在 App_Start 文件夹的 RouteConfig.cs 文件中消除或注释掉以下语句:`

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;

namespace myNameSpace.Configurations
{
    public static class RouteConfig
    {

        public static void Register(HttpConfiguration config)
        {
            // Web API routes
            //DON'T USE THIS. IT WILL GIVE PROBLEMS IN INSTANTIATION OF OBJECTS
            //config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "LocationData",
                routeTemplate: "dataservices/locations/{controller}/{action}/{id}",
                defaults: new {action = "Index", id = RouteParameter.Optional }
            );


            config.Routes.MapHttpRoute(
                name: "ProfileData",
                routeTemplate: "dataservices/profiles/{controller}/{action}/{id}",
                defaults: new { action = "Index", id = RouteParameter.Optional }
            );



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

    }
}

在我的 Global.asax.cs 文件中,我使用的是旧的路由注册

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using System.Net.Http.Formatting;

using myNameSpace.IoC;
using myNameSpace.Configurations; // Here actually I change the protected void Application_Start() to protected void Configuration() and change the folder to configuration instead on App_Start
using myNameSpace.Controllers.ExceptionSchema;
using myNameSpace.Filters.HttpFilters;

namespace myNameSpace
{
    public class WebApiApplication : System.Web.HttpApplication
    {
        public static void RegisterApis(HttpConfiguration config)
        {
            config.Filters.Add(new CustomHttpExceptionFilter());
        }
        protected void Application_Start()
        {
            //AreaRegistration.RegisterAllAreas();
            RegisterApis(GlobalConfiguration.Configuration);


            var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
            json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
            GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);


            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.Register(GlobalConfiguration.Configuration);
        }
    }
}

原因如下: Web API 2 中的属性路由

注意:从 Web API 1 迁移

在 Web API 2 之前,Web API 项目模板生成的代码如下:

protected void Application_Start()
{
    // WARNING - Not compatible with attribute routing.
    WebApiConfig.Register(GlobalConfiguration.Configuration);
}

如果启用了属性路由,此代码将引发异常。如果您升级现有 Web API 项目以使用属性路由,请确保将此配置代码更新为以下内容:

protected void Application_Start()
{
    // Pass a delegate to the Configure method.
    GlobalConfiguration.Configure(WebApiConfig.Register);
}

我正在使用旧路由,我决定不使用属性路由。所以拿出那个声明

于 2014-09-09T10:53:54.697 回答
1

解决方案是在GlobalConfiguration.Configuration.EnsureInitialized();完成所有 Web API 相关配置后调用,但我很好奇为什么您的注册看起来像这样...您使用什么样的项目模板来创建 MVC5 项目?...预定义的模板Visual Studio 附带的结构有助于最大限度地减少路由排序问题,因此建议使用它们,所以想知道为什么您的配置结构看起来像那样......

于 2013-11-09T20:04:30.443 回答