Web API HttpPost方法始终接收GET

问题描述 投票:1回答:1

我有一个带有方法的web api控制器

[HttpPost]
[Authorize]
[Route("[action]")]
public async Task<IActionResult> Authenticate(HttpRequestMessage msg)
{
     //msg.Method is always GET
     // msg.Content is null 

}

我从我的桌面应用程序中调用它,如下所示:

HttpClient client = new HttpClient(new HttpClientHandler(){AllowAutoRedirect = false});
foreach (var header in headers)
{
    client.DefaultRequestHeaders.Add(header.Key, header.Value);
}
var content = new StringContent(jsonContent, Encoding.UTF8, "application/json");
await client.PostAsync(requestUrl, content);

但是在web api方法中,属性msg.Method总是GET而msg.Content是null

它是一种重定向或其他故意行为,每个请求变成GET?

我试着改变它

[Authorize]
[HttpPost]
[Route("[action]")]
public async Task<IActionResult> C2dSend([FromBody]string request)
{
    return Ok();
}

但是电话后得到了'BadRequest'。

唯一有效的方法是用动态替换字符串:

[Authorize]
[HttpPost]
[Route("[action]")]
public async Task<IActionResult> C2dSend([FromBody]dynamic request)
{
    return Ok();
}
c# http-post asp.net-core-webapi dotnet-httpclient http-get
1个回答
2
投票

只有POST请求被路由到您的操作。你只是看错了地方 - 你试图将你的请求的主体绑定到HttpRequestMessage实例。显然,你在这里传递别的东西。

如果您要查找请求详细信息,请使用控制器的Request属性。它由contoller上下文填充,在激活期间传递给控制器​​:

[Authorize]
[HttpPost]
[Route("[action]")]
public async Task<IActionResult> C2dSend()
{
    // Request.Method is POST here
    return Ok();
}

但是您不需要使用它来获取请求内容。让Asp.Net为您完成这项工作 - 声明一个模型类,它具有与您发送的序列化对象相同的属性,模型绑定器将为您执行反序列化工作:

[Authorize]
[HttpPost]
[Route("[action]")]
public async Task<IActionResult> C2dSend(YourModel blah)
{
    // model will be populated automatically from request body
    return Ok();
}

注意:有一种更简单的方法来发送json请求。您可以使用System.Net.Http.Formatting.Extension中的PostAsJsonAsync扩展

© www.soinside.com 2019 - 2024. All rights reserved.