ASP.MVC web api路由问题

时间:2013-03-12 11:32:25

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

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

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

2 个答案:

答案 0 :(得分:1)

根据我对Web API和路由的经验,最好将默认操作置于底部。我还删除了“全部捕获”,并为基本动词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调用Postman时,我会与Fiddler一起使用一个方便的小Chrome加载项。它允许您保存URL和多个环境以便快速调试。

答案 1 :(得分:0)

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

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

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