ASP.NET WebApi: comment effectuer une publication en plusieurs parties avec téléchargement de fichier à l’aide de WebApi HttpClient

J’ai un service WebApi qui gère un téléchargement depuis un formulaire simple, comme celui-ci:

Cependant, je ne peux pas comprendre comment simuler le même article en utilisant l’API HttpClient. Le bit FormUrlEncodedContent est assez simple, mais comment append le contenu du fichier avec le nom à la publication?

Après beaucoup d’essais et d’erreurs, voici le code qui fonctionne réellement:

 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 SsortingngContent(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; } } 

Vous devez rechercher différentes sous-classes de HttpContent .

Vous créez un contenu HTTP multiforme et y ajoutez différentes parties. Dans votre cas, vous avez un contenu de tableau d’octets et une URL de forme codée selon les lignes suivantes :

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

Merci @ Michael Tepper pour votre réponse.

J’ai dû poster des pièces jointes à MailGun (fournisseur de messagerie) et j’ai dû le modifier légèrement pour accepter mes pièces jointes.

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

Ici pour référence future. Merci.