Buchung Audio (byte-array) MVC.NET Web-Api
Das Problem
Ich versuche zu senden audio-aufgezeichnet von meinem android-Gerät auf einen MVC.NET Web-Api. Ich bestätigte den Zusammenhang durch die übergabe einfache string-Parameter. Jedoch, wenn ich versuche, pass auf das byte-array generiert aus den audio -, bekomme ich einen 500 server jedes mal. Ich habe versucht mehrere Konfigurationen, aber hier ist, was ich derzeit habe:
MVC-Web-API
public class PostParms
{
public string AudioSource { get; set; }
public string ExtraInfo { get; set; }
}
public class MediaController : ApiController
{
[HttpPost]
public string Post([FromBody]PostParms parms)
{
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(parms.AudioSource);
return "success";
}
}
Android-Code
public class WebServiceTask extends AsyncTask<String, Void, Long>
{
@Override
protected Long doInBackground(String... parms)
{
long totalsize = 0;
String filepath = parms[0];
byte[] fileByte = convertAudioFileToByte(new File(filepath));
//Tried base64 below with Convert.FromBase64 on the C# side
//String bytesstring = Base64.encodeToString(fileByte, Base64.DEFAULT);
String bytesstring = "";
try
{
String t = new String(fileByte,"UTF-8");
bytesstring = t;
} catch (UnsupportedEncodingException e1)
{
//TODO Auto-generated catch block
e1.printStackTrace();
}
URL url;
HttpURLConnection urlConnection = null;
try {
url = new URL("http://my.webservice.com:8185/api/media");
//setup for connection
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setUseCaches(false);
urlConnection.setRequestMethod("POST");
urlConnection.setDoOutput(true);
urlConnection.setRequestProperty("Content-Type","application/json");
urlConnection.setRequestProperty("Accept","application/json");
urlConnection.connect();
JSONObject json = new JSONObject();
json.put("AudioSource", bytesstring);
json.put("ExtraInfo", "none");
DataOutputStream output = new DataOutputStream(urlConnection.getOutputStream());
output.writeBytes(URLEncoder.encode(json.toString(),"UTF-8"));
output.flush();
output.close();
} catch (IOException e) {
//TODO Auto-generated catch block
e.printStackTrace();
} catch (JSONException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
finally {
urlConnection.disconnect();
}
return totalsize;
}
protected void onPreExecute(){
}
protected void onPostExecute(){
}
private byte[] convertAudioFileToByte(File file) {
byte[] bFile = new byte[(int) file.length()];
try {
//convert file into array of bytes
FileInputStream fileInputStream = new FileInputStream(file);
fileInputStream.read(bFile);
fileInputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
return bFile;
}
}
Ich eine bekommen kann .NET-Anwendung zu arbeiten, mit der gleichen API sendet eine audio-stream, aber nicht Android. Wie ich schon sagte, ich habe versucht, eine Reihe von Konfigurationen im internet gefunden, die mit der Kodierung und der output-stream, aber weiterhin 500. Ich brauche Hilfe, da ich ratlos bin.
Vielen Dank im Voraus
InformationsquelleAutor Chase Caillet | 2014-02-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich verwendet ByteArrayEntity statt StringEntity
Auf der server-Seite habe ich diese web-api-code, um die byte-array
Hoffe, das hilft
Dies sollte so markiert werden, dass die akzeptierte Antwort für WebApi 2
InformationsquelleAutor Asa
Ich habe gerade gebucht eine Frage auf Stack Overflow bei Hochladen/Herunterladen von Byte-Arrays, die mit AngularJS und ASP.NET Web-API relevanten (Teil -) zu deiner Frage hier. Möchten Sie vielleicht zu Lesen, dass die post zum festlegen des Kontexts für meine Antwort. Es wird über das senden und empfangen von byte[]'s über die Web-API. Ich habe ein Problem mit dem Ansatz, aber es hat zu tun mit der JavaScript-client falsch Umgang mit der server-Antwort.
Ich würde die folgenden änderungen vornehmen, um Ihre Server-Side code wie folgt:
Lesen Sie den Beitrag in http://byterot.blogspot.com/2012/04/aspnet-web-api-series-part-5.html
Verwenden/hinzufügen Byte-Rot ist eine asynchrone version der Medien-Formatierer für byte[]'s.
Ich hatte zu zwicken formatter wie gezeigt unten für eine neuere version von ASP.NET.
Hatte ich auch, fügen Sie die folgende Zeile in der config-Datei.
/*********************************** Client-Code *************************************/
Benötigen Sie für die Verwendung von 'Content-Type': 'application/octet-stream' auf dem client.
Kannst du die byte[] als Binär, aber es wurde zu lang, da ich in C# gecodet auf dem client.
Denke ich, dass die Zeile: output.writeBytes(URLEncoder.encode(json.toString(),"UTF-8")); muss geändert werden, da ein minimum.
Ich werde haben Sie einen Blick und sehen, ob ich finden kann, einige C# - client-code-snippets, die relevant sein könnten.
Bearbeiten, müssen Sie möglicherweise einen Blick auf die C# - client-code der folgende Beitrag. Es kann Ihnen helfen, optimieren Sie Ihren code, um die Arbeit mit dem Ansatz, den ich vorgeschlagen.
Wie man byte-array richtig aus einer Web-Api-Methode in C#?
InformationsquelleAutor Highdown