【问题标题】:Attribute Routing doesn't work [closed]属性路由不起作用[关闭]
【发布时间】:2018-04-30 03:33:34
【问题描述】:

我正在 Visual Studio Express 2013 中创建一个 rest api。

我有 2 个控制器:一个用于订单,一个用于客户。

我已经创建了以下内容:

/api/clients获取所有客户端的信息

/api/clients/1 GET id = 1 的客户端信息

/api/orders/10 GET id = 10 的订单信息

现在,我想创建这个:

/api/clients/1/orders - 获取所有 id 为 1 的客户订单的信息

我已经阅读了有关属性路由的信息,但我无法使其工作。

OrdersController.cs

[EnableCors(origins: "*", headers: "*", methods: "*")]
public class OrdersController : ApiController
{
    public Order Get(string id)
    {
        // ...
    }

    [Route("clients/{id}/orders")]
    public List<Order> GetByClient(string id)
    {
        // ...
    }
}

WebApiConfig.cs

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Enable CORS
        config.EnableCors();

        //config.MapHttpAttributeRoutes();

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

RouteConfig.cs

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}

像这样,所有其他请求都正常工作,但是当我尝试访问 /api/clients/1/orders 时,我收到错误 HTTP Error 404.0 - Not Found. The resource you are looking for has been removed, had its name changed, or is temporarily unavailable.

但是,一旦我取消注释 config.MapHttpAttributeRoutes();,我就无法再访问任何请求 - 他们都返回:

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

我在这里做错了什么?

【问题讨论】:

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


【解决方案1】:

使用路由属性[Route("clients/{id}/orders")],您应该使用/clients/1/orders 而不是/api/clients/1/orders url 访问操作GetByClient()。要拥有原始网址,只需修复路由:

[Route("api/clients/{id}/orders")]
public List<Order> GetByClient(string id)

【讨论】:

  • 解决了,谢谢:)
【解决方案2】:

取消注释您的 config.MapHttpAttributeRoutes() 行,然后在您的 Global.asax 文件中,替换:

WebApiConfig.Register(GlobalConfiguration.Configuration);

用这个:

GlobalConfiguration.Configure(WebApiConfig.Register);

你可以在这里阅读:

Attribute Routing in ASP.NET Web API 2

【讨论】:

  • 这解决了无法访问任何请求的问题,但是,正如其他用户指出的那样,我的路由路径仍然错误。我希望我可以将您的两个答案都指定为已接受...谢谢!
  • 如果不修复配置,该路径将永远无法正常工作。你真正的问题是 global.asax。
猜你喜欢
  • 1970-01-01
  • 2013-06-01
  • 2014-12-27
  • 2016-01-06
  • 2014-03-25
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多