2017-05-01 1 views
0

接続を作成した後、IDを送信してから応答を保存し、何度も何度も(通常60〜100 IDまで)送信する必要があります。しかし、私はこのエラーを得たWebRequest複数の書き込みと読み取り

public void EThread() 
{ 
    HttpWebRequest HWRequest = (HttpWebRequest)WebRequest.Create(_AjaxURL); 
    HWRequest.Method = "POST"; 
    HWRequest.ContentType = "text/xml; encoding='utf-8'"; 

    string StrID; 

    while(!_RequiredIDs.IsEmpty) 
     if (_RequiredIDs.TryDequeue(out StrID)) 
      Extract(StrID, ref HWRequest); 
} 

public void Extract(string ID, ref HttpWebRequest HWRequest) 
{ 
    string data = "strID=" + ID; 
    byte[] Bytes = Encoding.ASCII.GetBytes(data); 

    using (Stream SWriter = HWRequest.GetRequestStream()) 
    { 
     SWriter.Write(Bytes, 0, Bytes.Length); 
     SWriter.Close(); 
    } 

    HttpWebResponse resp = (HttpWebResponse)HWRequest.GetResponse(); 

    using (Stream s = resp.GetResponseStream()) 
    using (StreamReader sr = new StreamReader(s)) 
     _RespnseCollection.Enqueue(sr.ReadToEnd()); 
} 

System.Net.WebException: 'The request was aborted: The connection was closed unexpectedly.現在、私はそれをこのようにしました。もし私がHttpWebRequestをExtractメソッドの中に入れたら、それは動作しますが、それは長く働きます。これは1つのスレッドでチェックされました。コードの何が間違っているか、またはサーバーがこれをサポートしていません。

+0

あなたは、私はそれがworks'抽出メソッド内のHttpWebRequestを置く場合は 'によって何を意味しています。メソッドを呼び出すたびに、新しいHttpWebRequestオブジェクトを '再作成する 'ことを意味しますか?あなたの現在のコードでは、最初の使用後にリクエストストリームが閉じられ、後続の呼び出しでエラーが発生します。 –

+0

毎回、「再作成」しますが、実行したくありません。私は 'SWriter.Close()'も削除します。同じエラー。私は 'WebClient'で使ったアプローチを提示しました。すべてがうまくいきましたが、この目的のために' WebClient'は十分ではありません。 –

+0

すべてのIDを1回のリクエストで送信できますか? –

答えて

0

問題は、HWRequestを再使用していることです。しかし、HttpWebRequestは1回限りの使用です。言い換えれば、要求を1回だけ消すことができます。

THR _RequiredIDsが複数の項目が含まれているのであれば、最初の項目は正常に動作しますが、完成にHwRequestの状態を変更する(すなわち、それは今の応答が含まれている)とHaveResponseプロパティがtrueに設定されますされます。

GetRequestStream()またはGetResponse()を再度実行すると、すでに応答を受信して​​いるため、要求を再度設定することは意味がありません。

次のようにあなたのコードを修正することができます:

public void EThread() 
{ 

    string StrID; 

    while(!_RequiredIDs.IsEmpty) 
     if (_RequiredIDs.TryDequeue(out StrID)) 
     { 
      HttpWebRequest HWRequest = (HttpWebRequest)WebRequest.Create(_AjaxURL); 
      HWRequest.Method = "POST"; 
      HWRequest.ContentType = "text/xml; encoding='utf-8'"; 
      Extract(StrID, ref HWRequest); 
     } 
} 

をしかし、私はこれは本当にHttpRequestを宣言し、Extractメソッド内の初期化と機能的に同等であると仮定します。

SUGGESTIION: HWRequest.Reset()を呼び出してみてください。

public void EThread() 
{ 
    HttpWebRequest HWRequest = (HttpWebRequest)WebRequest.Create(_AjaxURL); 
    HWRequest.Method = "POST"; 
    HWRequest.ContentType = "text/xml; encoding='utf-8'"; 

    string StrID; 

    while(!_RequiredIDs.IsEmpty) 
     if (_RequiredIDs.TryDequeue(out StrID)) 
     { 
      Extract(StrID, ref HWRequest); 
      HWRequest.Reset(); 
     } 
} 
+0

はい、同じです。サーバーの接続には多少の時間がかかりますので、可能であれば接続を再利用したいのですが、そうでなければ最適なスレッドのダウンロード量を見つけるだけです。 –

+0

しかし、ここで直面しているコアの問題である 'HttpWebRequest'で接続を再利用することはできません。 –

+0

代替手段はありますか? 'WebClient'を使うとうまくいきますが、スピードアップを考えていますが、ここで' WebClient'を使うことはできません。 –

関連する問題