Как получить данные HttpRequestMessage
У меня есть контроллер MVC API со следующим действием.
Я не понимаю, как читать фактические данные/тело сообщения?
[HttpPost]
public void Confirmation(HttpRequestMessage request)
{
var content = request.Content;
}
Ответы
Ответ 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>();