1

我正在尝试并排使用 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 参数可以帮助框架解决它。

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

4

2 回答 2

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 和多个环境以进行快速调试。

于 2013-03-20T00:06:13.690 回答
0

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

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

大多数浏览器都有一个分析器,可以让您详细检查您的 HTTP 请求(例如Chrome 的网络面板)。如果请求不是来自浏览器,您可以尝试像Fiddler这样的独立分析器。

于 2013-03-13T18:35:53.360 回答