2016-05-24 10 views
0

Kurz gesagt, ich muss ein Array byte[] als Körper Wert senden. Das Problem ist, dass [FromBody] immer Null ist. Alle Lösungen, die ich bisher gesehen habe, beinhalten, dass der übergebene Wert auf die eine oder andere Weise an eine Zeichenkette geht. Dies ist in Ordnung, wenn der ursprüngliche Inhalt, der übergeben wird, einfacher Text ist (ASCII), aber in Fällen, in denen ich zum Beispiel ein JPG sende, funktioniert das nicht.Verwendung von WebClient zu POST zu WebAPI mit [FromBody]

Es ist extrem wichtig, zu erkennen und zu wissen, dass ich HTTPClient nicht verwenden kann, wie es aus irgendeinem Grund in irgendeiner Form hinzufügt, bricht die Lösung an allen möglichen Orten. Ich stecke mit dem WebClient fest. Hier

ist der Code Ich habe unter:

Berufung Seite:

Private Function UploadFile(targetURL As String, fileAttachment As Byte()) As String 
    Dim retVal As String = String.Empty 
    Using client = New WebClient() 
     Try     
      Dim request As HttpWebRequest = DirectCast(WebRequest.Create(targetURL), HttpWebRequest) 
      request.Method = "POST" 
      request.ContentType = "application/x-www-form-urlencoded" 
      request.ContentLength = fileAttachment.Length 

      Dim requestStream As Stream = request.GetRequestStream() 
      requestStream.Write(fileAttachment, 0, fileAttachment.Length) 

      Dim response As WebResponse = request.GetResponse() 
      Dim respStream As Stream = response.GetResponseStream() 
      Dim reader As New StreamReader(respStream) 

      retVal = reader.ReadToEnd() 
      respStream.Dispose() 
      reader.Dispose() 
     Catch ex As WebException 
      If ex.Status = WebExceptionStatus.ProtocolError Then 
       Dim wbrsp As HttpWebResponse = CType(ex.Response, HttpWebResponse) 
       Throw New HttpException(CInt(wbrsp.StatusCode), wbrsp.StatusDescription) 
      Else 
       Throw New HttpException(500, ex.Message) 
      End If 
     End Try 
    End Using 
    Return retVal 
End Function 

WebAPI Methode:

[Route("Upload/{appName}/{appKey}/{fileName}/{fileExt}")] 
    public async Task<string> Post(string appName, string appKey, string fileName, string fileExt, [FromBody] byte[] values) { 
//snip as rest is not needed since values is always null 

Was für eine vernünftige Lösung wäre, so dass die Byte-Array wird nicht konvertiert zu einer Zeichenkette (die die Werte "korrumpiert")?

+0

Warum machen Sie nicht den Param-Typ "Wert" zu streamen und später in Byte in der API zu konvertieren? – TusharJ

+0

Das Problem damit war, weil FromBody Param immer Null war, erhält es aus dem Request-Objekt eine Zeichenfolge zurück und dies verursacht Probleme mit dem Byte-Array, wenn die Quelle kein einfacher Text (wie ein JPG) ist. Auf jeden Fall habe ich es herausgefunden und eine Antwortantwort geschrieben. – MetalPhoenix

Antwort

0

Die Lösung hierfür war kontraintuitiv:

//targetURL As String, fileAttachment As Byte(), fileName As String, fileExtension As String 
//you don't send the data to the webapi action. You WRITE to it like it's a file   
Using client = New WebClient() 
    Try 
     client.Headers.Add("Content-Type", "application/octet-stream") 
     Using requestStream As Stream = client.OpenWrite(New Uri(targetURL), "POST") 
      requestStream.Write(fileAttachment, 0, fileAttachment.Length) 
     End Using  
    Catch ex As WebException 
     If ex.Status = WebExceptionStatus.ProtocolError Then 
      Dim wbrsp As HttpWebResponse = CType(ex.Response, HttpWebResponse) 
      Throw New HttpException(CInt(wbrsp.StatusCode), wbrsp.StatusDescription) 
     Else 
      Throw New HttpException(500, ex.Message, New Exception("File upload failed.")) 
     End If 
    End Try 
End Using 

Und die magische Code für die WebAPI:

byte[] values = await Request.Content.ReadAsByteArrayAsync(); 

Sie denken nicht an Daten an eine URL, die Art und Weise zu senden Sie‘ d schreibe in eine Datei, weil du einfach nicht die Dinge so machen aber es funktioniert und der Byte-Stream wird nicht in eine Zeichenfolge in dem Prozess (die den Stream von "beschädigt" wird beibehalten, wenn die Quelle nicht konvertiert wird einfach ascii

Natürlich ist das große Problem dabei, dass die OpenWrite-Methode nichts zurückgibt, egal wie Sie die WebAPI-Aktion zum Zurückgeben von Daten einrichten. Alles, was Sie tun können, ist eine Ausnahme auszulösen, wenn etwas brennt. Wenn Sie Daten zurückgeben möchten, müssen Sie einfach eine weitere Aktion schreiben, um Daten abzurufen, die bei Ihrem ersten Anruf erstellt wurden (in diesem Fall eine eindeutige ID für die hochgeladene und gespeicherte Datei).

Verwandte Themen