我在Global.asax中有默认路由:
RouteTable.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = System.Web.Http.RouteParameter.Optional }
);
我希望能够针对特定的功能,所以我创建了另一个路由:
RouteTable.Routes.MapHttpRoute(
name: "WithActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = System.Web.Http.RouteParameter.Optional }
);
因此,在我的控制器中,我有:
public string Get(int id)
{
return "object of id id";
}
[HttpGet]
public IEnumerable<string> ByCategoryId(int id)
{
return new string[] { "byCategory1", "byCategory2" };
}
给.../api/records/bycategoryid/5
打电话会给我我想要的。但是,调用.../api/records/1
会给出错误
找到了与请求匹配的多个操作:...
我理解其中的原因--路由只是定义了哪些URL是有效的,但是当涉及到函数匹配时,Get(int id)
和ByCategoryId(int id)
都会匹配api/{controller}/{id}
,这就是让框架感到困惑的地方。
我需要做什么才能让默认的API路由再次工作,并保留使用{action}
的路由?我考虑创建一个名为RecordByCategoryIdController
的不同控制器来匹配默认的API路由,为此我将请求.../api/recordbycategoryid/5
。然而,我发现这是一个“脏”(因此不令人满意)的解决方案。我一直在寻找这个问题的答案,但没有任何关于在{action}
中使用路由的教程提到了这个问题。
发布于 2012-11-28 10:15:43
路由引擎使用与您向其中添加规则时相同的顺序。一旦它获得了第一个匹配的规则,它将停止检查其他规则,并利用它来搜索控制器和操作。
因此,您应该:
RouteTable.Routes.MapHttpRoute
首先映射"WithActionApi“,然后映射"DefaultApi”。defaults: new { id = System.Web.Http.RouteParameter.Optional }
”规则的WithActionApi参数,因为一旦id是可选的,像"/api/{part1}/{part2}“这样的url将永远不会进入到您的"DefaultApi”的命名操作,以告知路由引擎进入哪个操作。否则,一旦您的控制器中有多个操作,引擎将不知道要使用哪个操作,并抛出“找到与请求匹配的多个操作:...”。然后,要使其与Get方法匹配,请使用ActionNameAttribute.因此,您的路由应该如下所示:
// Map this rule first
RouteTable.Routes.MapRoute(
"WithActionApi",
"api/{controller}/{action}/{id}"
);
RouteTable.Routes.MapRoute(
"DefaultApi",
"api/{controller}/{id}",
new { action="DefaultAction", id = System.Web.Http.RouteParameter.Optional }
);
和你的控制器:
[ActionName("DefaultAction")] //Map Action and you can name your method with any text
public string Get(int id)
{
return "object of id id";
}
[HttpGet]
public IEnumerable<string> ByCategoryId(int id)
{
return new string[] { "byCategory1", "byCategory2" };
}
发布于 2014-06-18 15:56:54
您可以使用Attribute routing解决您的问题
控制器
[Route("api/category/{categoryId}")]
public IEnumerable<Order> GetCategoryId(int categoryId) { ... }
jquery中的URI
api/category/1
路由配置
using System.Web.Http;
namespace WebApplication
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API routes
config.MapHttpAttributeRoutes();
// Other Web API configuration not shown.
}
}
}
并且您的默认路由是作为基于默认约定的路由工作的
控制器
public string Get(int id)
{
return "object of id id";
}
Jquery中的URI
/api/records/1
路由配置
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Attribute routing.
config.MapHttpAttributeRoutes();
// Convention-based routing.
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
有关Attribute routing and onvention-based routing here和this的详细信息,请查看文章
发布于 2018-09-10 15:53:31
尝尝这个。
public class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
var json = config.Formatters.JsonFormatter;
json.SupportedMediaTypes.Add(new System.Net.Http.Headers.MediaTypeHeaderValue("application/json"));
config.Formatters.Remove(config.Formatters.XmlFormatter);
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional , Action =RouteParameter.Optional }
);
}
}
https://stackoverflow.com/questions/13596391
复制相似问题