IFormFile
специально работает только с кодировкой multipart/form-data
, поэтому он прекрасно подходит для вашего первого действия.Однако в том запросе, который вы делаете, самая большая проблема заключается в том, что вы даже не отправляете файл в запросе.Тогда вам также нужно будет использовать multipart/form-data
вместо application/octet-stream
.
. Обработка с помощью WebRequest
на самом деле довольно сложна, и HttpClient
является предпочтительным способом делать запросы в любом случае.С HttpClient
:
string apiResponse;
using (var httpClient = new HttpClient())
{
var form = new MultipartFormDataContent();
using (var fileStream = file.OpenReadStream())
{
form.Add(new StreamContent(fileStream), "file", file.Filename);
using (var response = await httpClient.PostAsync(url, form))
{
response.EnsureSuccessStatusCode();
apiResponse = await response.Content.ReadAsStringAsync();
}
}
}
Я хотел сделать пример намеренно простым, но на самом деле вы не должны использовать HttpClient
как этот.По большей части его следует рассматривать как синглтон, что, к счастью, довольно просто с помощью IHttpClientFactory
.Во-первых, вам понадобится какой-то класс-обертка, который в любом случае является хорошей идеей, когда вы работаете с API:
public class ReservationService
{
private readonly HttpClient _client;
public ReservationService(HttpClient client)
{
_client = client ?? throw new ArgumentNullException(nameof(client));
}
public async Task<string> AddFileAsync(IFormFile file)
{
var form = new MultipartFormDataContent();
using (var fileStream = file.OpenReadStream())
{
form.Add(new StreamContent(fileStream), "file", file.Filename);
using (var response = await httpClient.PostAsync("", form))
{
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync();
}
}
}
}
Затем в ConfigureServices
в Startup.cs
:
services.AddScoped<ReservationService>();
services.AddHttpClient<ReservationService>(c =>
{
c.BaseAddress = new Uri("http://localhost:8888/api/Reservation");
});
Наконец, в вашем контроллере:
public class FooController : Controller
{
private readonly ReservationService _service;
public FooController(ReservationService service)
{
_service = service ?? throw new ArgumentNullException(nameof(service));
}
...
[HttpPost]
public async Task<IActionResult> AddFile(IFormFile file)
{
var apiResponse = await _service.AddFileAsync(file);
// whatever else you want to do
}
}