2017-06-07 1 views
0

J'ai créé en Xamarin Forms pour iOS une fonction HttpClient pour envoyer une image de l'appareil à mon serveur. La fonction de base estXamarin Forms, Android et HttpClient issue

var content = new MultipartFormDataContent(); 

var fileContent = new ByteArrayContent(fileBytes); 
fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/form-data"); 
fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") 
{ 
    FileName = fName 
}; 
fileContent.Headers.ContentDisposition.Parameters 
        .Add(new NameValueHeaderValue("userId", UserId.ToString())); 
content.Add(fileContent); 

using (var client = new HttpClient()) { 
    client.DefaultRequestHeaders.Add("authenticationToken", SyncData.Token); 

    HttpResponseMessage response = await client.PostAsync(url, content); 
    if (response.IsSuccessStatusCode) 
    { 
     // more code 
    } 
} 

J'utilise System.Net.Http. J'ai essayé d'utiliser la même fonction pour un projet sous Android mais étonnamment ça ne marche pas. Le problème est dans l'en-tête: si j'inspecte fileContent je peux voir toutes les clés mais pour webapi sur le serveur FileName n'est pas reçu.

Après quelques journaux, j'ai changé cette fonction en ajoutant plus client.DefaultRequestHeaders comme

client.DefaultRequestHeaders.Add("FileName", fName); 

Maintenant, le WebAPI reçoit FileName param. Maintenant, ma question est: qu'est-ce que je me suis trompé?

Répondre

0

Personnellement, j'utilise la méthode Add sur MultipartFormDataContent qui accepte un nom de fichier.

var content = new MultipartFormDataContent(); 
var fileContent = new ByteArrayContent(fileBytes); 

... 

// Use the overload Add method which accepts a file name 
content.Add(fileContent, "FileName", fName); 

... 

Je ne sais pas si cela va résoudre votre problème ou non, mais cela fonctionne pour moi.

+0

Merci @ deckerton_9000, j'ai résolu le problème avec 'client.DefaultRequestHeaders.Add (" FileName ", fName);'. Mon problème est que je ne peux pas avoir mon 'httpclient' partagé entre iOS et Android – Enrico

+0

Avez-vous envisagé d'utiliser le paquet nuget" Microsoft.Net.Http "? Cela devrait être compatible pour Android et iOS. Remarque: vous devrez supprimer les références de projet à System.Net.Http avant d'ajouter ce nuget pour éviter les collisions d'espaces de noms et les redirections de liaison. –

+0

Si vous utilisez une bibliothèque de classes portable, vous pouvez très certainement partager le code HttpClient entre Android et iOS. –