Подтвердить что ты не робот

Как получить данные HttpRequestMessage

У меня есть контроллер MVC API со следующим действием.

Я не понимаю, как читать фактические данные/тело сообщения?

[HttpPost]
public void Confirmation(HttpRequestMessage request)
{
    var content = request.Content;
}
4b9b3361

Ответ 1

Из этого ответа:

[HttpPost]
public void Confirmation(HttpRequestMessage request)
{
    var content = request.Content;
    string jsonContent = content.ReadAsStringAsync().Result;
}

Примечание. Как видно из комментариев, этот код может вызвать взаимоблокировку и не должен использоваться. Смотрите этот блог для более подробной информации.

Ответ 2

  System.IO.StreamReader reader = new System.IO.StreamReader(HttpContext.Current.Request.InputStream);
  reader.BaseStream.Position = 0;
  string requestFromPost = reader.ReadToEnd();

Ответ 3

Я предлагаю вам не делать этого так. Методы действий должны быть спроектированы так, чтобы их можно было легко протестировать. В этом случае вам не следует обращаться к данным непосредственно из запроса, потому что если вы сделаете это так, когда вы хотите unit test этот код, вы должны построить HttpRequestMessage.

Вы должны сделать это так, чтобы MVC выполнил всю привязку модели к вам:

[HttpPost]
public void Confirmation(YOURDTO yourobj)//assume that you define YOURDTO elsewhere
{
        //your logic to process input parameters.

}

В случае, если вы хотите получить доступ к запросу. Вы просто получаете доступ к свойству Request контроллера (а не по параметрам). Вот так:

[HttpPost]
public void Confirmation()
{
    var content = Request.Content.ReadAsStringAsync().Result;
}

В MVC свойство Request на самом деле является оберткой .NET HttpRequest и наследуется от базового класса. Когда вам нужно unit test, вы также можете издеваться над этим объектом.

Ответ 4

Если вы хотите привести к классу, а не просто к строке:

YourClass model = await request.Content.ReadAsAsync<YourClass>();