2011-02-08 19 views
9

a specific issue with my ASP.NET applicationをデバッグしようとしています。で例外をスローサーバーから切断せずにHttpWebRequestを再利用できますか?

void uploadFile(string serverUrl, string filePath) 
{ 
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest. 
     Create(serverUrl); 
    CredentialCache cache = new CredentialCache(); 
    cache.Add(new Uri(serverUrl), "Basic", new NetworkCredential("User", "pass")); 
    request.Credentials = cache; 
    request.Method = "POST"; 
    request.ContentType = "application/octet-stream"; 
    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 
} 

Write():クライアントは、次のコードを実行し、「トランスポート接続にデータを書き込むことができません:あなたのホストマシンにソフトウェアによって中止された確立された接続」テキスト。 System.Net tracingを使用し、Content-Lengthと設定してリクエストを送信したときに問題が発生することが判明しました。私は、サーバー上のコードでusing文の中で、すべてを省略した場合

は、具体的に速やかWWW-Authenticateで応答し、クライアントはWWW-Authenticateで要求をrepostsし、すべてがアップロードされていないで、ファイルを除いて罰金になり、要求はかなり後に失敗しました。

私は次のことをしたいと思います:データなしでリクエストを送信し、WWW-Authenticateを待ってから、WWW-Authenticateとデータでそれを繰り返してください。最初にすべてのパラメータを設定してから、を呼び出して送信しますが、ContentLengthプロパティを設定しようとすると、「このプロパティは書き込み開始後に設定できません」という例外がスローされます。

したがってHttpWebRequestは再利用できないようです。

接続を終了せずにリクエストを再送信するために再利用するにはどうすればよいですか?

+0

私も同じ問題があります。あなたがソリューションを手に入れたら、変更された新しいコードを提供してください。 – Herin

+0

@Herin:nonceで認証を使用する場合、解決策はありません。基本認証のようなものを使用する場合は、WWW-Authenticateフェーズがないように、「Authorization」ヘッダーを設定することができます。 – sharptooth

+0

しかし、私は 'stream.Write(buffer、0、bytesRead)'の行にエラーが表示されています。あなたが修正されたコードを提供して、私がよりよく理解できるようにしてください。ありがとう – Herin

答えて

16

リクエストを再利用しません。名前が示すとおり、リクエストは1つです。ただし、同じホストに対して複数の要求を発行すると、.NETはデフォルトでネットワーク接続を再利用します。あなたはrequest.GetResponseによって返さWebResponseを処分する必要性を行う

注 - そうでない場合は基盤となるインフラストラクチャは、あなたが実際にそれで行われていることを知ることができません、との接続を再利用することはできません。

(さておき、なぜあなたはただ、直接File.OpenReadによって返されたストリームを使うのか?BinaryReaderを使用しているとして。)

+0

WebResponseの廃棄を保証することができます。私はWebResponseを私のアプリケーションの1つで処理していないので、いくつかのHttpWebRequestsをインスタンス化していたので、不快なメモリリークが発生しました。 – jlafay

+0

私の問題を解決するために他のどのようなメカニズムを使うことができますか?具体的には、認証を取得してから同じWWW認証を再利用する必要がありますか? – sharptooth

+0

@sharptooth:なぜレスポンスからヘッダーをつかんで次のリクエストで使うことができないのかは分かりません。なぜあなたは同じオブジェクトを再利用しなければならないと思いますか? –

2

ジョンスキートの答えに加えて、手動ん。ContentLengthプロパティを設定する必要はありません。 HttpWebRequestはそのプロパティを自動的に計算して設定します。

関連する問題