現在、WCF RESTサービスへのファイルアップロードの実装には苦労しています。WCF RESTサービスに送信されたデータはストリーム入力パラメータには入りません
クライアントは次の処理を行います。
serverUrl
は "のhttp:// localhostを:/Service1.svc/UploadFile" である
void uploadFile(string serverUrl, string filePath)
{
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.
Create(serverUrl);
request.Method = "POST";
request.ContentType = "multipart/form-data";
request.SendChunked = true;
request.Timeout = 60000;
request.KeepAlive = true;
using(BinaryReader reader = new BinaryReader(
File.OpenRead(filePath))) {
request.ContentLength = reader.BaseStream.Length;
using(Stream stream = request.GetRequestStream()) {
byte[] buffer = new byte[1024];
while(true) {
int bytesRead = reader.Read(buffer, 0, buffer.Length);
if(bytesRead == 0) {
break;
}
stream.Write(buffer, 0, bytesRead);
}
}
}
HttpWebResponse result = (HttpWebResponse)request.GetResponse();
//handle result - not relevant
}
。私は、サービスを起動し、次の問題が発生したクライアントコードを実行する
public string UploadFile(System.IO.Stream fileData)
{
byte[] buffer = new byte[1024];
while(true) {
int readAmount = fileData.Read(buffer, 0, buffer.Length);
if(readAmount == 0) {
break;
}
}
return "";
}
:として実装されて
[OperationContract]
[WebInvoke(Method="POST")]
string UploadFile(System.IO.Stream fileData);
は、以下:
WCF RESTサービスは、次のシグネチャを持つメソッドを有します。
クライアントはwhileループを開始し、制御はサービスメソッドに入り、サーバーはwhileループを開始します。サーバー上のRead
がゼロを返した場合、制御が失敗し、サーバーメソッドが戻ります。一方、クライアントは、Write()
を呼び出すことを試みる例外を得る - 「トランスポート接続にデータを書き込むことができません:既存の接続はリモートホストによって強制的に閉じられました」
私には、リクエストにストリームしようとするファイルデータがサーバーメソッドパラメータにマップされていないようです。私は間違って何をしていますか?
私はすべてそれを試して、それほど助けになりません。 Fiddlerを使用しないと、クライアントは現在、「基底の接続が閉じられました:受信時に予期しないエラーが発生しました。」という例外をスローします。要求はサーバーに到達し、サーバーの動作は以前と同じです。 Fiddlerでは、クライアント上でHTTP 502 Bad Gatewayを取得し、要求がサーバーに届かないため、リクエストはFiddlerで合理的に見えます。 – sharptooth
は、localhostが(hostsファイル経由で)別の場所を指すように変更されていますか?別のマシンでサービスをホストするとどうなりますか?プロキシを通過しようとしていますか? Fiddlerを使用して手動でサービスにリクエストを送信できますか。もしそうなら、それは機能しますか?あなたのクライアントは、TestMethod()のようなサービス上で通常の操作をすることができますか?ストリーミングせずに試してみてください。 –