10

私が持っているバグを手伝ってくれるかどうか疑問に思っていました。Web サイトからの POSTing/GETing データの処理に役立つ HTTP Manager を作成しました。私が両方の混合物を使用しようとしている最近まで、それはうまくいきました。最初のループではすべてが機能し、2 番目のループでは HttpWebRequest.GetRequestStream() でハングします。私はネット全体を読みましたが、本当の解決策は見つかりませんでした。以下は、フェッチ/受信のコードブロックです。

 ASCIIEncoding encoding = new ASCIIEncoding();
 byte[] buffer = encoding.GetBytes(_PostData);

_HttpWebRequest = (HttpWebRequest)WebRequest.Create(_FetchUrl);
_HttpWebRequest.Credentials = _Credentials;
_HttpWebRequest.Method = _RequestType.ToString();
_HttpWebRequest.ContentType = "application/x-www-form-urlencoded";
_HttpWebRequest.ContentLength = buffer.Length;
_HttpWebRequest.UserAgent = userAgent;
_HttpWebRequest.CookieContainer = _CookieContainer;
_HttpWebRequest.KeepAlive = false;
_HttpWebRequest.AllowAutoRedirect = _AllowAutoRedirect;
_HttpWebRequest.AutomaticDecompression = DecompressionMethods.GZip;
_HttpWebRequest.ServicePoint.Expect100Continue = false;  

 if (_RequestType.Equals(RequestTypes.POST))
{
     // Write POST
 Stream reqStream = _HttpWebRequest.GetRequestStream();
 {
  reqStream.Write(buffer, 0, buffer.Length);
  reqStream.Flush();
  reqStream.Close();
    }
}

そして応答:

HttpWebResponse httpWebResponse = (HttpWebResponse)_HttpWebRequest.GetResponse();
{
  Stream responseStream = httpWebResponse.GetResponseStream();
  {
    if (_UseGzip)
    {
      if (httpWebResponse.ContentEncoding.ToLower().Contains("gzip"))
      {
        responseStream = new GZipStream(responseStream, CompressionMode.Decompress);
      }
      else
      {
        responseStream = new DeflateStream(responseStream, CompressionMode.Decompress);
      }
    }

    if (responseStream != null)
    {
      StreamReader streamReader = new StreamReader(responseStream);
      {
        try
        {
          _PageContent = streamReader.ReadToEnd();
        }
        finally
        {
          streamReader.Close();
          responseStream.Close();
          httpWebResponse.Close();
        }
      }
    }
    else
    {
      _PageContent = string.Empty;
    }
  }
}
_HttpWebRequest.Abort();

私のコードがハングしている理由について、誰かが何か欠陥を見ることができますか? すべてのストリームが閉じられています。許可された接続を 100 以上に設定しました。これが壊れている理由がわかりません。

4

3 に答える 3

11

これは、WebResponse、ストリーム、またはStreamReaderを破棄していないことが原因である可能性があります。

var request = WebRequest.Create(...);
using (var response = request.GetResponse())
{
    using (var responseStream = response.GetResponseStream())
    {
        using (var reader = new StreamReader(responseStream))
        {
            // use the reader
        }
    }
}
于 2010-02-21T07:19:53.090 に答える
2

私も同じ問題を抱えていました。これらの using ブロックを使用して、すべてのストリームと HttpWebResponse を正しく閉じ (破棄) しました。ThreadAbortExceptions によって中止されたリクエストをスパム送信しても、問題は解決しませんでした。最後に、ThreadAbortException が発生したときに myWebRequest.Abort() を呼び出すのに役立ちました。お役に立てれば。

于 2011-06-22T12:30:43.867 に答える
0

あなたが使用していることがわかります:

HttpWebRequest.AutomaticDecompression = DecompressionMethods.GZip;

手動減圧アプローチに加えて:

      if (httpWebResponse.ContentEncoding.ToLower().Contains("gzip"))
      {
        responseStream = new GZipStream(responseStream, CompressionMode.Decompress);
      }
      else
      {
        responseStream = new DeflateStream(responseStream, CompressionMode.Decompress);
      }

それが本当に重要かどうかは試しませんでしたが、手動のアプローチと同様のコードのみを使用しており、正常に動作します。実際にはハングアップの問題がありますが、1つのドメインのみで、プロパティを試してみると違いが示されました。

ああ、ポスト データ圧縮を使用しない場合は、コンテンツ エンコーディング ヘッダーを削除する必要があると思います。

于 2013-11-27T07:58:56.800 に答える