Web API HttpPost 方法总是接收 GET
Web API HttpPost method always receives GET
我有一个带有方法
的网络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'。
唯一可行的是用动态替换字符串:
[Authorize]
[HttpPost]
[Route("[action]")]
public async Task<IActionResult> C2dSend([FromBody]dynamic request)
{
return Ok();
}
只有 POST 个请求被路由到您的操作。您只是看错了地方 - 您正试图将请求的主体绑定到 HttpRequestMessage
实例。显然,你在这里传递了其他东西。
如果您要查找请求详细信息,请使用控制器的 Request
属性。它由在激活期间传递给控制器的控制器上下文填充:
[Authorize]
[HttpPost]
[Route("[action]")]
public async Task<IActionResult> C2dSend()
{
// Request.Method is POST here
return Ok();
}
但您不需要使用它来获取请求内容。让 Asp.Net 为您完成这项工作 - 声明一个模型 class,它与您发送的序列化对象具有相同的属性,模型绑定器将为您完成反序列化工作:
[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 扩展
我有一个带有方法
的网络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'。
唯一可行的是用动态替换字符串:
[Authorize]
[HttpPost]
[Route("[action]")]
public async Task<IActionResult> C2dSend([FromBody]dynamic request)
{
return Ok();
}
只有 POST 个请求被路由到您的操作。您只是看错了地方 - 您正试图将请求的主体绑定到 HttpRequestMessage
实例。显然,你在这里传递了其他东西。
如果您要查找请求详细信息,请使用控制器的 Request
属性。它由在激活期间传递给控制器的控制器上下文填充:
[Authorize]
[HttpPost]
[Route("[action]")]
public async Task<IActionResult> C2dSend()
{
// Request.Method is POST here
return Ok();
}
但您不需要使用它来获取请求内容。让 Asp.Net 为您完成这项工作 - 声明一个模型 class,它与您发送的序列化对象具有相同的属性,模型绑定器将为您完成反序列化工作:
[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 扩展