【问题标题】:ASP.MVC web api routing issuesASP.MVC web api 路由问题
【发布时间】:2013-03-20 08:06:13
【问题描述】:

我正在尝试同时使用 Web API 和 Web 应用程序,但在 Web API 路由方面遇到了一些问题。

这些是路线配置:

routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

// Map this rule first
        config.Routes.MapHttpRoute(
            name: "WithActionApi",
             routeTemplate: "api/{controller}/{action}/"
         );

        //sets up the API route
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/"
            //,defaults: new { id = RouteParameter.Optional }
        );

它适用于 Web 应用程序,适用于仅包含 /api/controller 的 Web api,但如果我调用 /api/controll/action 则无法正常工作

我正在使用:

[HttpPost]
    [ActionName("ConfirmRequest")]
    public HttpResponseMessage ConfirmRequest(string guid, string type, PartiStatus status = PartiStatus.Yes)

指定动作动词和名称。我尝试了路由调试器(在 web api 中不起作用)和另一个可以(并且崩溃)并且无法使 POST 操作起作用的调试器。

我最终将此操作更改为 GET 并且它工作正常,我猜 GET 参数有助于框架解决它。

我仍然不确定如何使其正常工作。 (没有个性映射到行动)

【问题讨论】:

    标签: asp.net-mvc asp.net-web-api asp.net-mvc-routing


    【解决方案1】:

    根据我在 Web API 和路由方面的经验,最好将默认操作放在底部。我还删除了“catch all”,并为基本动词 GET/PUT/POST/DELETE 设置了每个控制器的默认值。

    试试这样的

        config.Routes.MapHttpRoute(
            name: "WithActionApi",
            routeTemplate: "api/Target/ConfirmRequest/{id}",
            defaults: new { id = RouteParameter.Optional }
         );
    
        config.Routes.MapHttpRoute(
            name: "Default",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
         );
    

    您的示例调用看起来像这样

    POST api/Target/ConfirmRequest?guid={guid}&type={type}&status{status}
    

    在快速测试 REST API 调用时,我与 Fiddler 一起使用了一个方便的小 Chrome 插件,Postman。它可以让您保存 URL 和多个环境以进行快速调试。

    【讨论】:

      【解决方案2】:

      确保您实际上是向相关 URL 发出 POST 请求。看起来您的路由似乎是正确的,虽然您已经提到如果您将 [HttpPost] 属性更改为 [HttpGet] 会起作用,但您没有提到相应地更改您的请求。

      如果您向 ConfirmRequest 操作的 URL 发出 GET 请求,并且其唯一的重载由 [HttpPost] 属性修饰,则该请求将不会映射到此操作。

      大多数浏览器都有一个分析器,可以让您详细检查您的 HTTP 请求(例如Chrome's Network Panel)。如果请求不是来自浏览器,您可以尝试使用独立的分析器,例如 Fiddler

      【讨论】:

      • 谢谢!我在 [HttpGet] 时使用 Get,在 [HttpPost] 时使用 post,并使用 fiddler 验证和提交 post/get。
      • 路由仍然无法正常工作?你得到什么结果
      猜你喜欢
      • 2014-11-27
      • 2013-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-24
      • 2013-04-17
      相关资源
      最近更新 更多