web-dev-qa-db-fra.com

envoyer un tableau d'octets par HTTP POST application en magasin

J'essaie d'envoyer des images + des métadonnées à un serveur via une publication HTTP à partir d'une application Windows Store, mais je suis bloqué lorsque j'essaie d'inclure les données dans la publication. Cela ne peut pas être fait comme vous le feriez dans une application Windows Forms ou similaire en raison des modifications apportées à l'API de l'application de magasin.

Je reçois l'erreur. 

cannot convert source type byte[] to target type System.Net.Http.httpContent

maintenant c'est évidemment parce qu'il y a 2 types différents qui ne peuvent pas être implicitement exprimés, mais c'est fondamentalement ce que je cherche à pouvoir faire. Comment puis-je obtenir mes données de tableau d'octets dans le type httpContent afin de pouvoir les inclure dans l'appel suivant

httpClient.PostAsync(Uri uri,HttpContent content);

voici ma méthode de téléchargement complet:

async private Task UploadPhotos(List<Photo> photoCollection, string recipient, string format)
    {
        PhotoDataGroupDTO photoGroupDTO = PhotoSessionMapper.Map(photoCollection);

        try
        {
            var client = new HttpClient();
            client.MaxResponseContentBufferSize = 256000;
            client.DefaultRequestHeaders.Add("Upload", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)");

            // POST action_begin
            const string actionBeginUri = "http://localhost:51139/PhotoService.axd?action=Begin";
            HttpResponseMessage response = await client.GetAsync(actionBeginUri);
            response.EnsureSuccessStatusCode();
            string responseBodyAsText = await response.Content.ReadAsStringAsync();
            string id = responseBodyAsText;
            ////

            // POST action_upload
            Uri actionUploadUri = new Uri("http://localhost:51139/PhotoService.axd?action=Upload&brand={0}&id={1}&name={2}.jpg");

            var metaData = new Dictionary<string, string>()
            {
                {"Id", id},
                {"Brand", "M3rror"}, //TODO: Denne tekst skal komme fra en konfigurationsfil.
                {"Format", format},
                {"Recipient", recipient}
            };

            string stringData = "";
            foreach (string key in metaData.Keys)
            {
                string value;
                metaData.TryGetValue(key, out value);
                stringData += key + "=" + value + ",";
            }

            UTF8Encoding encoding = new UTF8Encoding();
            byte[] byteData = encoding.GetBytes(stringData);

            HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, actionUploadUri);

            // send meta data
            // TODO get byte data in as content
            HttpContent metaDataContent = byteData;
            HttpResponseMessage actionUploadResponse = await client.PostAsync(actionUploadUri, metaDataContent);

            actionUploadResponse.EnsureSuccessStatusCode();
            responseBodyAsText = await actionUploadResponse.Content.ReadAsStringAsync();

            // send photos
            // TODO get byte data in as content
            foreach (byte[] imageData in photoGroupDTO.PhotosData)
            {
                HttpContent imageContent = imageData;
                actionUploadResponse = await client.PostAsync(actionUploadUri, imageContent);
                actionUploadResponse.EnsureSuccessStatusCode();
                responseBodyAsText = await actionUploadResponse.Content.ReadAsStringAsync();
            }                
            ////

            // POST action_complete
            const string actionCompleteUri = "http://localhost:51139/PhotoService.axd?action=Complete";
            HttpResponseMessage actionCompleteResponse = await client.GetAsync(actionCompleteUri);
            actionCompleteResponse.EnsureSuccessStatusCode();
            responseBodyAsText = await actionCompleteResponse.Content.ReadAsStringAsync();
            ////
        }

        catch (HttpRequestException e)
        {
        }
        catch (Exception e)
        {
            Debug.WriteLine(e.ToString());
        }
    }
15
Essah

Il sera plus simple d'utiliser System.Net.Http.ByteArrayContent. Par exemple:

// Converting byte[] into System.Net.Http.HttpContent.
byte[] data = new byte[] { 1, 2, 3, 4, 5};
ByteArrayContent byteContent = new ByteArrayContent(data);
HttpResponseMessage reponse = await client.PostAsync(uri, byteContent);

Pour le texte uniquement avec un codage de texte spécifique, utilisez:

// Convert string into System.Net.Http.HttpContent using UTF-8 encoding.
StringContent stringContent = new StringContent(
    "blah blah",
    System.Text.Encoding.UTF8);
HttpResponseMessage reponse = await client.PostAsync(uri, stringContent);

Ou, comme vous l'avez mentionné ci-dessus, pour le texte et les images utilisant multipart/form-data: 

// Send binary data and string data in a single request.
MultipartFormDataContent multipartContent = new MultipartFormDataContent();
multipartContent.Add(byteContent);
multipartContent.Add(stringContent);
HttpResponseMessage reponse = await client.PostAsync(uri, multipartContent);
34
kiewic

Vous devez envelopper le tableau d'octets dans un type HttpContent.

Si vous utilisez System, Net.Http.HttpClient:

HttpContent metaDataContent = new ByteArrayContent(byteData);

Si vous utilisez le fichier préféré Windows.Web.Http.HttpClient:

Stream stream = new MemoryStream(byteData);
HttpContent metaDataContent = new HttpStreamContent(stream.AsInputStream());
9
Jon

Le concept que vous recherchez s'appelle Sérialisation . La sérialisation signifie la préparation de vos données (qui pourraient être hétérogènes et sans structure prédéfinie) pour le stockage ou la transmission. Ensuite, lorsque vous devez réutiliser les données, vous effectuez l'opération inverse, la désérialisation, et récupérez la structure de données d'origine. Le lien ci-dessus montre quelques méthodes sur la façon dont cela pourrait être fait en C #.

0
Ermir