1

WebRequest を使用してデータとファイルを送信したい。

byte[] fileStream = File.ReadAllBytes(path);

ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(delegate { return true; });

WebRequest request = WebRequest.Create(url);

request.ContentType = "application/json";
request.Method = "POST";
request.Credentials = new NetworkCredential("name", "pw");

Stream dataStream = request.GetRequestStream();
dataStream.Write(Encoding.UTF8.GetBytes(data), 0, Encoding.UTF8.GetBytes(data).Length);
//dataStream.Write(fileStream, 0, fileStream.Length);

dataStream.Write(fileStream, 0, fileStream.Length); //CAUSES A CRASH
dataStream.Close();
WebResponse response = request.GetResponse();

「dataStream.Write(fileStream, 0, fileStream.Length);」を含めると、なぜ失敗するのかわかりません。内部エラーが発生したと言って、サーバーがストリームの受け入れに失敗する行。サーバーが必要とするデータを表示する CURL コマンドが動作しています。

curl -k -X POST -u name:pw -H "Content-type: application/json"
-H 'Accept:application/json''url'
-d'{parameters}'
--data-binary @file.wav

上記の行を除外すると、コマンドは期待どおりに機能し、入力ファイルがないことがわかります。だから、file.wavに何か問題があるのではないかと思います

4

1 に答える 1

1

そのコードは、JSON形式のデータを書き込み、その直後にfile.wavの生のバイトを書き込みます。これは、受信サーバーが期待していることではない可能性があります。通常、ファイルとデータを同時に送信する場合は、MIMEマルチパートエンコーディングを使用します。自動的にそれを行っている可能性がcurlあります。Fiddlerなどのデバッグプロキシを接続し、curl実際に送信されているものを監視して、その仮説を確認するとよいでしょう。次に、C#でそれをエミュレートしてみてください。

マルチパートメッセージを送信する必要がある場合は、使用している.NETFrameworkのバージョンを知っておくと役立ちます。新しいバージョンのいくつかでは、それを行うためのより簡単な方法があります。

于 2012-12-04T20:19:47.527 に答える