Метод HttpPost веб-API всегда получает GET - PullRequest
0 голосов
/ 04 марта 2019

У меня есть контроллер веб-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();
}

1 Ответ

0 голосов
/ 05 марта 2019

Только POST-запросы направляются на ваши действия.Вы просто смотрите не в том месте - вы пытаетесь привязать тело вашего запроса к HttpRequestMessage экземпляру.Очевидно, вы передаете здесь что-то еще.

Если вы ищете детали запроса, используйте свойство контроллера Request.Он заполняется из контекста контроллера, который передается контроллеру во время активации:

[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.Вы можете использовать расширение PostAsJsonAsync из System.Net.Http.Formatting.Extension

...