ASP.NET WebApi: как выполнить многостраничную запись с загрузкой файла с помощью WebApi HttpClient

У меня есть служба WebApi, обрабатывающая загрузку из простой формы, например:

Однако я не могу понять, как имитировать один и тот же пост с помощью API HttpClient. FormUrlEncodedContent достаточно прост, но как добавить содержимое файла с именем в сообщение?

После долгих проб и ошибок, вот код, который действительно работает:

 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); 

Здесь для дальнейшего использования. Благодарю.

Давайте будем гением компьютера.