我有一个带有方法的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);
但是在网络api方法中,属性msg.Method
始终是GET,而msg.Content为null
每个请求都变成GET的重定向还是其他故意行为?
我试图将其更改为
[Authorize]
[HttpPost]
[Route("[action]")]
public async Task<IActionResult> C2dSend([FromBody]string request)
{
return Ok();
}
但通话后收到“ BadRequest”。
唯一有效的方法是将字符串替换为dynamic:
[Authorize]
[HttpPost]
[Route("[action]")]
public async Task<IActionResult> C2dSend([FromBody]dynamic request)
{
return Ok();
}
答案 0 :(得分: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扩展