ASP.NET WebApi: как выполнить многостраничную запись с загрузкой файла с помощью WebApi HttpClient
У меня есть служба WebApi, обрабатывающая загрузку из простой формы, например:
Однако я не могу понять, как имитировать один и тот же пост с помощью API HttpClient. FormUrlEncodedContent
достаточно прост, но как добавить содержимое файла с именем в сообщение?
- Тестирование / интеграция Тестирование веб-API с помощью HttpClient в Visual Studio 2013
- Как я могу узнать, когда истечет время ожидания HttpClient?
- HttpClient vs HttpWebRequest
- Причина ошибки CS0161: не все пути кода возвращают значение
- C # HttpClient 4.5 multipart / form-data upload
- Безопасно ли использовать HttpClient одновременно?
- Повторная попытка неудачных запросов HttpClient
- .NET HttpClient. Как значение строки POST?
- Выбор между HttpClient и WebClient
- Почему HttpClient BaseAddress не работает?
- HttpClient - задача была отменена?
- Нужно ли удалять HttpClient и HttpClientHandler?
- Каковы накладные расходы на создание нового HttpClient на один вызов в клиенте WebAPI?
После долгих проб и ошибок, вот код, который действительно работает:
using (var client = new HttpClient()) { using (var content = new MultipartFormDataContent()) { var values = new[] { new KeyValuePair("Foo", "Bar"), new KeyValuePair("More", "Less"), }; foreach (var keyValuePair in values) { content.Add(new StringContent(keyValuePair.Value), keyValuePair.Key); } var fileContent = new ByteArrayContent(System.IO.File.ReadAllBytes(fileName)); fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = "Foo.txt" }; content.Add(fileContent); var requestUri = "/api/action"; var result = client.PostAsync(requestUri, content).Result; } }
Вам нужно искать различные подclassы HttpContent
.
Вы создаете многообразный http-контент и добавляете к нему различные части. В вашем случае у вас есть содержимое массива байтов и форма url, закодированная по строкам :
HttpClient c = new HttpClient(); var fileContent = new ByteArrayContent(new byte[100]); fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = "myFilename.txt" }; var formData = new FormUrlEncodedContent(new[] { new KeyValuePair("name", "ali"), new KeyValuePair("title", "ostad") }); MultipartContent content = new MultipartContent(); content.Add(formData); content.Add(fileContent); c.PostAsync(myUrl, content);
Спасибо @Michael Tepper за ваш ответ.
Мне пришлось отправлять вложения в MailGun (поставщик электронной почты), и мне пришлось немного изменить его, чтобы он принял мои вложения.
var fileContent = new ByteArrayContent(System.IO.File.ReadAllBytes(fileName)); fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data") //<- 'form-data' instead of 'attachment' { Name = "attachment", // <- included line... FileName = "Foo.txt", }; multipartFormDataContent.Add(fileContent);
Здесь для дальнейшего использования. Благодарю.