2014-05-07 6 views
9

Ich versuche, einige Bilder + einige Metadaten an einen Server per HTTP-Post aus einer Windows-Store-App senden, aber stecken bleiben, wenn Sie versuchen, die Daten in den Beitrag tatsächlich aufzunehmen. Es kann nicht so ausgeführt werden, wie Sie dies in einer Windows Forms-App oder ähnlichem aufgrund der Änderungen an der Store-App-API erreichen würden.senden Byte-Array von HTTP-POST in Store-App

Ich bekomme den Fehler.

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

dies jetzt ist offensichtlich, weil es zwei verschiedene Arten gibt, die nicht implizit gegossen werden kann, aber es ist im Grunde, was ich suche der Lage sein, zu tun. Wie mache ich meine Byte-Array-Daten in das bekommen httpContent geben, damit ich es in den folgenden Aufruf enthalten

httpClient.PostAsync(Uri uri,HttpContent content); 

hier meine volle Upload-Methode:

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

Doesn müssen die Binärdaten * serialisiert * werden? Wahrscheinlich möchten Sie es auch * streamen *, anstatt es auf einmal hochzuladen. http://stackoverflow.com/questions/19005991/webapi-how-to-handle-images kann helfen. – bytefire

Antwort

18

Es einfacher sein wird, Verwenden Sie System.Net.Http.ByteArrayContent. ZB:

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

Für Text ist nur mit einer bestimmten Text-Codierung verwenden:

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

Oder wie Sie bereits erwähnt, für Text und Bilder unter Verwendung von 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

Was ist schnell genug, sicher, um die Daten zu verarbeiten, die die Kombination von Text und Zahlen enthält (etwa 1lakh Datensätze in einer Liste-json serialisiert)? ByteArrayContent oder StringContent. Bitte schlagen Sie vor: – Ganesh

+0

'StringContent' sollte gut genug sein – kiewic

+0

danke :) @kiewic – Ganesh

0

Das Konzept Sie suchen, heißt Serialization. Serialisierung bedeutet, dass Sie Ihre Daten (die heterogen und ohne vordefinierte Struktur sein können) für die Speicherung oder Übertragung vorbereiten. Wenn Sie die Daten erneut verwenden müssen, führen Sie die umgekehrte Operation Deserialisierung durch und erhalten die ursprüngliche Datenstruktur zurück. Der obige Link zeigt einige Methoden, wie dies in C# gemacht werden könnte.

+0

der Link oben zeige nichts –

7

Sie müssen das Byte-Array in einen HttpContent-Typ umbrechen.

Wenn Sie System, Net.Http.HttpClient:

HttpContent metaDataContent = new ByteArrayContent(byteData); 

Wenn Sie die bevorzugte Windows.Web.Http.HttpClient verwenden:

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

Sie haben gerade mein Leben gerettet! –

+0

Was sollte das serverseitige Aktionsmuster sein, um einen 'ByteArrayContent' zu akzeptieren? – Shimmy