【问题标题】:Catch-all route fails to find route with WebApi2 ApiControllerCatch-all 路由无法使用 WebApi2 ApiController 找到路由
【发布时间】:2014-01-10 12:43:04
【问题描述】:

我正在创建一个 WebApi2 服务,我想要实现的方法之一表示来自内部树结构中的对象的 HTTP GET - 因此请求将遵循以下行:

GET /values/path/path/to/object/in/tree

所以我希望我的方法接收“path/to/object/in/tree”。

但是,当我运行此程序时,我只得到一个 404,有趣的是,我得到一个与标准 IIS 404 不同的 404。它的标题是“'/'应用程序中的服务器错误。”,而用于一个完全无效的资源标题为“HTTP Error 404.0 - Not Found”。

我正在使用默认模板来尝试看看我是否可以让它工作,因此相似。

我有这个给我的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 派生,它可以正常工作,但是正常的属性路由不起作用。

我尝试按照this post (http://www.tugberkugurlu.com/archive/asp-net-web-api-catch-all-route-parameter-binding) 中的方法进行操作,但无法使用。

我确定我错过了一些非常简单的事情,但是在花了几个小时之后,我认为问我做错了什么是明智的。

谢谢

M

【问题讨论】:

  • 你还记得config.MapHttpAttributeRoutes();注册属性路由吗?

标签: c# asp.net attributerouting asp.net-web-api2


【解决方案1】:

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 控制器设计的。

【讨论】:

  • 我想骂人。谢谢。
猜你喜欢
  • 2010-11-29
  • 2021-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-12
  • 1970-01-01
  • 2015-04-06
  • 2017-09-29
相关资源
最近更新 更多