Вы надеетесь, что можете использовать .ReadAsStringAsync()
в текущем запросе MVC, потому что, возможно, вы видели что-то подобное?
using Microsoft.AspNetCore.Mvc;
using System.Net.Http;
using System.Threading.Tasks;
namespace DL.SO.UI.Web.Controllers
{
public class DashboardController : Controller
{
// In order to be able to inject the factory, you need to register in Startup.cs
// services.AddHttpClient()
// .AddRouting(...)
// .AddMvc(...);
private readonly IHttpClientFactory _httpClientFactory;
public DashboardController(IHttpClientFactory httpClientFactory)
{
_httpClientFactory = httpClientFactory;
}
public async Task<IActionResult> Index()
{
var client = _httpClientFactory.CreateClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://www.google.com");
var response = await client.SendAsync(request);
if (response.IsSuccessStatusCode)
{
string bodyContent = await response.Content.ReadAsStringAsync();
}
return View();
}
}
}
Так вы используете HttpClient
для извлечения внешних данных / ресурсов вприложение..ReadAsStringAsync()
выключен HttpContent
, что является свойством либо HttpRequestMessage
, либо HttpResponseMessage
.HttpRequestMessage
и HttpResponseMessage
находятся в System.Net.Http
пространстве имен.
Но теперь вы в самом приложении!Все работает немного по-другому.У нас пока нет ответа на запрос (потому что мы еще не сделали return View();
).Следовательно, я предполагаю, что содержимое, которое вы хотите просмотреть, является содержимым поступающего запроса?
Содержимое запроса GET
Когда поступает запрос GET , MVC автоматическипривязать строки запроса запроса к параметрам метода действия в контроллере.Они также доступны в свойстве Query
текущего объекта Request
:
public IActionResult Index(int page = 1, int size = 15)
{
foreach (var param in Request.Query)
{
...
}
return View();
}
Содержимое запроса POST
Когда приходит запрос POST ,Request.Body
не всегда может иметь данные, которые вы ищете.Это зависит от типа содержимого запроса POST .
По умолчанию при отправке формы тип содержимого запроса form-data .MVC затем свяжет входные данные с вашей моделью представления в качестве параметра действия:
[HttpPost]
public async Task<IActionResult> Close(CloseReservationViewModel model)
{
Request.Form // contains all the inputs, name/value pairs
Request.Body // will be empty!
...
}
Если вы используете jQuery
для запуска POST запросов без указания contentType
, по умолчанию он равен x-www-form-urlencoded :
@section scripts {
<script type="text/javascript">
$(function() {
$.ajax({
url: '@Url.Action("test", "dashboard", new { area = "" })',
data: {
name: 'David Liang',
location: 'Portland Oregon'
},
method: 'POST'
}).done(function (response) {
console.info(response);
});
});
</script>
}
[HttpPost]
public async Task<IActionResult> Test()
{
string body;
using (var reader = new StreamReader(Request.Body))
{
body = await reader.ReadToEndAsync();
}
return Json(body);
}
Заключение
Если выЕсли вы хотите использовать HttpClient
для вызова внешних служб внутри вашего приложения MVC, вы можете использовать IHttpClientFactory
, HttpClient
из System.Net.Http
и получить HttpContent
из запроса или ответа без особых проблем.Затем вы можете отключить ReadAsStringAsync()
.
Если вы хотите просмотреть данные запроса, отправленные клиентом в ваше приложение MVC, MVC уже сделал так много, чтобы помочь вам связать данные с помощью привязки модели.Вы также можете прочитать тело запроса для POST запросов с StreamReader
.Просто обратите внимание, что это зависит от типа контента, Request.Body
может не соответствовать ожидаемому.