Catch-all 路由无法使用 WebApi2 ApiController 找到路由
-
21-12-2019 - |
题
我正在创建一个 WebApi2 服务,我想要实现的方法之一表示来自内部树结构中的对象的 HTTP GET - 因此请求将类似于:
GET /values/path/path/to/object/in/tree
所以我希望我的方法能够接收“path/to/object/in/tree”。
然而,当我运行这个程序时,我只是得到一个 404,有趣的是我得到的 404 与标准 IIS 404 看起来不同。其标题为“‘/’应用程序中的服务器错误”,而完全无效资源的标题为“HTTP 错误 404.0 - 未找到”。
我正在使用默认模板来尝试看看是否可以让它工作,因此有相似之处。
我有这个给我的 RouteConfig
public static void RegisterRoutes(RouteCollection routes)
{
var route = routes.MapRoute(
name: "CatchAllRoute",
url: "values/path/{*pathValue}",
defaults: new { controller = "Values", action = "GetPath" });
}
这是我的 ValuesController
:
[System.Web.Mvc.AuthorizeAttribute]
[RoutePrefix("values")]
public class ValuesController : ApiController
{
[Route("test/{value}")]
[HttpGet]
public string Test(string value)
{
return value;
}
[HttpGet]
public string GetPath(string pathValue)
{
return pathValue;
}
}
有趣的是,如果我来自 Controller
而不是 ApiController
它工作正常,但是正常的属性路由不起作用。
我尝试遵循中的方法 这篇文章(http://www.tugberkugurlu.com/archive/asp-net-web-api-catch-all-route-parameter-binding) 但我无法让它发挥作用。
我确信我错过了一些非常简单的事情,但是在花了几个小时之后,我认为谨慎的做法是问我做错了什么。
谢谢
中号
解决方案
Web api 路由与路由 MVC 不同。代替
route.MapRoute
尝试
public static void Register(HttpConfiguration config) {
config.MapHttpAttributeRoutes
config.Routes.MapHttpRoute(
name: "CatchAll", routeTemplate: "values/path/{*pathvalue}",
defaults: new {id = RouteParameter.Optional });
}
它在控制器上工作的原因是 MapRoute 是路由 MVC 控制器的正确格式,而 MapHttpRoute 是为 API 控制器设计的。
不隶属于 StackOverflow