【问题标题】:Multiple POST-request in web apiWeb api中的多个POST请求
【发布时间】:2015-11-14 11:28:38
【问题描述】:

我需要在 Web API 中使用多个 POST 请求,但出现错误:“找到与请求匹配的多个操作...”

我的控制器中有 2 个 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 }
);

【问题讨论】:

    标签: c# asp.net-web-api2 asp.net-web-api-routing


    【解决方案1】:

    可以使用[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 }
    );
    

    【讨论】:

    • 谢谢,它有帮助,但只有 3 条路线。默认无法处理。
    • 伙计,我遇到了几个小时的问题,直到我发现这是问题所在。谢谢!
    【解决方案2】:

    您应该使用 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 请求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-23
      • 2020-07-06
      • 2016-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多