web-dev-qa-db-ja.com

HTTPによるバイト配列の送信POSTストアアプリ内

WindowsストアアプリからHTTPポストによってサーバーにいくつかの画像とメタデータを送信しようとしていますが、実際にポストにデータを含めようとするとスタックします。ストアアプリAPIの変更により、Windowsフォームアプリなどでこれを実現する方法は実行できません。

エラーが表示されます。

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

これは明らかに、暗黙的にキャストできない2つの異なるタイプであるためですが、基本的に私ができることを探しているものです。次の呼び出しに含めることができるように、バイト配列データをhttpContent型に取得するにはどうすればよいですか

httpClient.PostAsync(Uri uri,HttpContent content);

ここに私の完全なアップロード方法があります:

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());
        }
    }
16
Essah

System.Net.Http.ByteArrayContentを使用する方が簡単です。例えば:

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

特定のテキストエンコーディングのみを使用するテキストの場合:

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

または、前述したように、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);
41
kiewic

バイト配列をHttpContent型でラップする必要があります。

System、Net.Http.HttpClientを使用している場合:

HttpContent metaDataContent = new ByteArrayContent(byteData);

優先Windows.Web.Http.HttpClientを使用している場合:

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

あなたが探している概念は シリアル化 と呼ばれます。シリアル化とは、ストレージまたは送信用にデータを準備することを意味します(異種混合で事前定義された構造がない場合もあります)。次に、データを再度使用する必要がある場合は、逆の操作、逆シリアル化を行い、元のデータ構造を取り戻します。上記のリンクは、C#でこれを行う方法に関するいくつかの方法を示しています。

1
Ermir