2014-05-07 12 views
9

Próbuję przesłać niektóre obrazy + niektóre dane meta do serwera przez post HTTP z aplikacji sklepu Windows, ale utknąłem, próbując faktycznie uwzględnić dane w poście. Nie można tego zrobić w taki sposób, w jaki można to osiągnąć w aplikacji formularzy systemu Windows lub podobnych ze względu na zmiany w interfejsie API aplikacji sklepu.Wysyłaj tablicę bajtów przez HTTP POST w aplikacji sklepu

Dostaję błąd.

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

teraz jest to oczywiście, bo to 2 różne typy, które nie mogą być niejawnie rzutować, ale to w zasadzie to, czego szukam, aby móc to zrobić. Jak zrobić aby moje dane tablicy bajtów Into the httpContent wpisać więc mogę umieścić go w następnym wywołaniu

httpClient.PostAsync(Uri uri,HttpContent content); 

oto moja metoda pełna Dodano:

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()); 
     } 
    } 
+0

robi czy dane binarne muszą być * serializowane *? Również prawdopodobnie chcesz * przesłać * zamiast przesyłać je wszystkie naraz. http://stackoverflow.com/questions/19005991/webapi-how-to-handle-images może pomóc. – bytefire

Odpowiedz

18

To będzie łatwiejsze do użyj System.Net.Http.ByteArrayContent. Np:

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

przypadku tekstu tylko z konkretnego zastosowania kodowania tekstu:

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

Albo jak wspomniano powyżej, tekst i obrazy przy użyciu 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); 
+0

Który jest wystarczająco szybki, bezpieczny, aby przetworzyć dane, które zawierają kombinację tekstu i liczb (około 1lakh rekordów w liście-json zserializowanej)? ByteArrayContent lub StringContent. Proszę zasugerować – Ganesh

+0

"StringContent" powinno być wystarczająco dobre – kiewic

+0

dzięki :) @kiewic – Ganesh

0

Koncepcja szukasz nazywa Serialization. Serializacja oznacza przygotowanie twoich danych (które mogą być heterogeniczne i bez predefiniowanych struktur) do przechowywania lub transmisji. Następnie, gdy musisz ponownie użyć danych, wykonasz operację odwrotną, deserializację i otrzymasz oryginalną strukturę danych. Powyższy link pokazuje kilka metod, w jaki sposób można to zrobić w języku C#.

+0

powyższy link nic nie pokazuje –

7

Musisz zawinąć tablicę bajtów w typie HttpContent.

Jeśli używasz systemu, Net.Http.HttpClient:

HttpContent metaDataContent = new ByteArrayContent(byteData); 

Jeśli używasz preferowany Windows.Web.Http.HttpClient:

Stream stream = new MemoryStream(byteData); 
HttpContent metaDataContent = new HttpStreamContent(stream.AsInputStream()); 
+1

Właśnie uratowałeś mi życie! –

+0

Jaki powinien być wzór działania po stronie serwera dla akceptacji 'ByteArrayContent'? – Shimmy

Powiązane problemy