web api中有多个POST请求

本文关键字:POST 请求 api web | 更新日期: 2023-09-27 18:21:58

我需要在web API中使用多个POST-request,但得到一个错误:"找到了多个与请求匹配的操作…"

我的控制器中有两个POST请求:

public void PostStart([FromBody]string value)
{
    CookieHeaderValue cookie = Request.Headers.GetCookies("user").FirstOrDefault();
    ...
}

public void PostLogin([FromBody]string value)
{
    CookieHeaderValue cookie = Request.Headers.GetCookies("user").FirstOrDefault();
    ...
}

我的路由文件当前如下:

public static void Register(HttpConfiguration config)
{
    config.MapHttpAttributeRoutes();
    config.Routes.MapHttpRoute(
        name: "apistart",
        routeTemplate: "Home/api/values/start/{id}",
        defaults: new { action = "PostStart", id = RouteParameter.Optional }
    );
    config.Routes.MapHttpRoute(
        name: "apilogin",
        routeTemplate: "Home/api/values/login/{id}",
        defaults: new { action = "PostLogin", id = RouteParameter.Optional }
    );
    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );
}

如果我从控制器中删除一个请求,一切都很好,所以我的路由看起来是有效的,但当两个请求都存在时,路由器找不到合适的。

有什么想法吗?我已经尝试过使用另一个默认路由,但它什么也没改变:

routes.MapHttpRoute(
    name: "ActionApi",
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

web api中有多个POST请求

您可以使用[HttpPost]属性指定请求方法:

[HttpPost]
public void Start([FromBody]string value)
{
    CookieHeaderValue cookie = Request.Headers.GetCookies("user").FirstOrDefault();
    ...
}
[HttpPost]
public void Login([FromBody]string value)
{
    CookieHeaderValue cookie = Request.Headers.GetCookies("user").FirstOrDefault();
    ...
}

这将允许您使用默认的基于操作的路由规则,使用任意数量的后期操作。

routes.MapHttpRoute(
    name: "ActionApi",
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

您应该使用RouteAttribute使其工作:

[Route("start")]
public void PostStart([FromBody]string value)
{
    CookieHeaderValue cookie = Request.Headers.GetCookies("user").FirstOrDefault();
    ...
}
[Route("login")]
public void PostLogin([FromBody]string value)
{
    CookieHeaderValue cookie = Request.Headers.GetCookies("user").FirstOrDefault();
    ...
}

WebApi并没有考虑方法名称,只是解析http方法的第一个单词。这就是为什么您会出现关于"多个操作…"的错误——有两个操作可以处理POST请求。