在阅读大量博客和教程的情况下,真的无法掌握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 }
);
答案 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);