Attribute Routing不起作用。

24 浏览
0 Comments

Attribute Routing不起作用。

我正在使用Visual Studio Express 2013创建一个REST API。

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

我已经创建了以下内容:

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

/api/clients/1 - 获取id为1的客户的信息

/api/orders/10 - 获取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 GetByClient(string id)
    {
        // ...
    }
}

WebApiConfig.cs

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // 启用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();,我就无法访问任何请求 - 它们都返回以下结果:


    An error has occurred.

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

    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)


我在这里做错了什么?

0
0 Comments

Attribute Routing是ASP.NET Web API 2中的一种路由方式。在使用Attribute Routing时,有一个问题是无法正常工作。问题的原因是没有正确配置Attribute Routing,解决方法是修改Global.asax文件中的代码。

首先,取消注释config.MapHttpAttributeRoutes()这一行代码。然后,在Global.asax文件中,将WebApiConfig.Register(GlobalConfiguration.Configuration);替换为GlobalConfiguration.Configure(WebApiConfig.Register);

具体的修改步骤如下:

1. 取消注释config.MapHttpAttributeRoutes()这一行代码。

2. 在Global.asax文件中,将WebApiConfig.Register(GlobalConfiguration.Configuration);替换为GlobalConfiguration.Configure(WebApiConfig.Register);

修改后,问题得到解决,可以正常访问请求了。

需要注意的是,虽然问题已经解决,但另一个用户指出路径设置错误。在感谢其他用户的回答时,作者指出了真正的问题是global.asax文件配置错误。

要使路径正常工作,必须先修复配置问题。作者对其他用户指出的问题表示感谢。

文章最后提到,如果可以的话,作者希望能将两个回答都标记为已接受。感谢大家的帮助!

更多关于Attribute Routing的内容可以参考:Attribute Routing in ASP.NET Web API 2

0
0 Comments

问题出现的原因是使用了错误的路由属性,并且访问的URL与路由属性不匹配。解决方法是修改路由属性以匹配访问的URL。

在下面的代码中,使用了路由属性[Route("clients/{id}/orders")],这意味着应该通过/clients/1/orders而不是/api/clients/1/orders来访问GetByClient()方法。为了使用原始的URL,只需修复路由属性如下:

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

通过上述修改,问题得到了解决。谢谢!

0