MVC路由问题

时间:2016-07-30 09:20:57

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

在阅读大量博客和教程的情况下,真的无法掌握MVC路由......

我有这个webapi功能:

public HttpResponseMessage UpsertProducts([FromUri] int marketplaceId, [FromUri] int datasourceId, [FromBody]List<HeisenbergProduct> heisenbergProducts)

Route.config中的默认路线:

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

一切正常。

我现在添加了另一个功能:

public HttpResponseMessage ReviseInventory([FromUri] int marketplaceId, [FromUri] int datasourceId, [FromBody]List<HeisenbergReviseInventory> heisenbergReviseInventories)

尽管动作名称不同,但似乎存在冲突,并且在调用其中任何一个时我得到500 internal server error - 我想它不知道使用哪一个。

我正在使用网址呼叫他们:

api/webapiproducts/upsertproducts?marketplaceId={0}&datasourceId={1}

我试图通过使用属性路由来解决这个问题:

[Route("/api/WebApiProducts/upsertproducts/{marketplaceid}/{datasourceid}")]
public HttpResponseMessage UpsertProducts([FromUri] int marketplaceId, [FromUri] int datasourceId, [FromBody]List<HeisenbergProduct> heisenbergProducts)

[Route("/api/WebApiProducts/reviseinventory/{marketplaceid}/{datasourceid}")]
public HttpResponseMessage ReviseInventory([FromUri] int marketplaceId, [FromUri] int datasourceId, [FromBody]List<HeisenbergReviseInventory> heisenbergReviseInventories)

我的路由属性似乎都不起作用。我做错了什么,我对这里的路由不了解?

正如@Nkosi指出的那样,我把错误的路径文件!这是我的WebApiConfig.cs内容:

config.MapHttpAttributeRoutes();

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

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

2 个答案:

答案 0 :(得分:1)

您展示的路线配置是针对MVC而不是网络API。查找将为Web API设置路由的WebApiConfig.cs文件

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Attribute routing.
        config.MapHttpAttributeRoutes();

        // Convention-based routing.
        config.Routes.MapHttpRoute(
            name: "DefaultActionApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

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

默认的基于约定的路由设置通常如下所示

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

没有动作占位符,这会导致你的路线冲突。

启用属性路由执行此操作

config.MapHttpAttributeRoutes();

更新WebApiConfig以包含正确的设置,以解决基于约定和属性路由的问题。

答案 1 :(得分:0)

通过更改我正在调用的URL来管理以使其使用属性路由:

string.Format("api/webapiproducts/reviseinventory/{0}/{1}", marketplaceId, datasourceId);