2011-01-20 8 views
0

現在、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()を呼び出すことを試みる例外を得る - 「トランスポート接続にデータを書き込むことができません:既存の接続はリモートホストによって強制的に閉じられました」

私には、リクエストにストリームしようとするファイルデータがサーバーメソッドパラメータにマップされていないようです。私は間違って何をしていますか?

答えて

0

おそらく別のコンテンツタイプを試しますか? "application/octet-stream"

このコードは私にとっては正しいものです。クライアントの部分がファイル全体を読み込んでいますか、それとも問題がありますか?まずそれをテストしてください。フィドラーを使用して、実際にワイヤがサービスに行き渡っているかどうかを確認します。

クライアントがバッファにファイル全体を読み込むことができた場合は、一度

request.Write(entireFileBuffer、0、entireFileLength)ですべてを送信してみてください。 request.close();

の代わりにそれをチャンクします。

+0

私はすべてそれを試して、それほど助けになりません。 Fiddlerを使用しないと、クライアントは現在、「基底の接続が閉じられました:受信時に予期しないエラーが発生しました。」という例外をスローします。要求はサーバーに到達し、サーバーの動作は以前と同じです。 Fiddlerでは、クライアント上でHTTP 502 Bad Gatewayを取得し、要求がサーバーに届かないため、リクエストはFiddlerで合理的に見えます。 – sharptooth

+0

は、localhostが(hostsファイル経由で)別の場所を指すように変更されていますか?別のマシンでサービスをホストするとどうなりますか?プロキシを通過しようとしていますか? Fiddlerを使用して手動でサービスにリクエストを送信できますか。もしそうなら、それは機能しますか?あなたのクライアントは、TestMethod()のようなサービス上で通常の操作をすることができますか?ストリーミングせずに試してみてください。 –

関連する問題