C# MVC路由问题
尽管阅读了大量关于MVC路由的博客和教程,但还是很难掌握MVC路由 我有这个webapi函数:C# MVC路由问题,c#,asp.net,asp.net-mvc,asp.net-web-api,asp.net-mvc-routing,C#,Asp.net,Asp.net Mvc,Asp.net Web Api,Asp.net Mvc Routing,尽管阅读了大量关于MVC路由的博客和教程,但还是很难掌握MVC路由 我有这个webapi函数: public HttpResponseMessage UpsertProducts([FromUri] int marketplaceId, [FromUri] int datasourceId, [FromBody]List<HeisenbergProduct> heisenbergProducts) public HttpResponseMessage ReviseInventory
public HttpResponseMessage UpsertProducts([FromUri] int marketplaceId, [FromUri] int datasourceId, [FromBody]List<HeisenbergProduct> heisenbergProducts)
public HttpResponseMessage ReviseInventory([FromUri] int marketplaceId, [FromUri] int datasourceId, [FromBody]List<HeisenbergReviseInventory> heisenbergReviseInventories)
一切都很好
我现在添加了另一个函数:
public HttpResponseMessage UpsertProducts([FromUri] int marketplaceId, [FromUri] int datasourceId, [FromBody]List<HeisenbergProduct> heisenbergProducts)
public HttpResponseMessage ReviseInventory([FromUri] int marketplaceId, [FromUri] int datasourceId, [FromBody]List<HeisenbergReviseInventory> heisenbergReviseInventories)
我试图通过使用属性路由绕过这个问题:
[Route("/api/WebApiProducts/upsertproducts/{marketplaceid}/{datasourceid}")]
public HttpResponseMessage UpsertProducts([FromUri] int marketplaceId, [FromUri] int datasourceId, [FromBody]List<HeisenbergProduct> heisenbergProducts)
您显示的路由配置是针对MVC而不是web 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
以包含正确的设置,这将解决基于约定和属性路由的问题。通过更改我调用的URL使其与属性路由一起工作:
string.Format("api/webapiproducts/reviseinventory/{0}/{1}", marketplaceId, datasourceId);
你是对的-我添加了错误的配置文件contect-我更新了问题以获得正确的数据。但是使用我的查询字符串参数仍然存在问题。我已经设法通过改变我正在呼叫的URL使它工作-我想你可以两种方式都做。看我的answer@Rick. 它们可以双向工作。映射路线的顺序很重要,因为第一条路线匹配的路线将获胜,更具体的路线将首先映射,更一般的路线将随后映射。您需要通过将最后一个映射上移1来切换顺序。它没有到达第二条基于约定的路线,因为它已经与第一条路线匹配。谢谢,是的,您的订购是正确的-我忘了。我更改了顺序,并尝试使用querystring方法调用,但仍然不起作用。我似乎仍然不得不使用我在回答中提出的方法。
config.MapHttpAttributeRoutes();
string.Format("api/webapiproducts/reviseinventory/{0}/{1}", marketplaceId, datasourceId);