HttpWebRequest:ベース接続がオフになっている例外:The underlying connection was closed.

2942 ワード

今日はIISでNetプログラムのすべてのエラーログは、良いニュースを発見しました.そこで探してみると、多くの人がこの異常に遭遇しているが、標準的な解決策はなく、一般的にいくつかある.
 
1.エージェントが使用されている場合は、正しく設定されています.
2.firewallを使ったら、firewallを止めてみましょう.
3.Lan設定のAutomatically Detect Settingsをオフにします.
4.再読み込みNet Framework.
5.キャプチャを使用した場合、HttpWebRequestのKeepAliveプロパティをfalseに設定できます.HttpWebRequestのKeepAliveプロパティのデフォルトはtrueです.
私のオンラインのプログラムに対応して、1、2、3、4はすべて排除することができて、私のはタイムズのこの間違いをつかんで、第5の方法を採用した後に、異常は消えました.
===================
サービス側の問題:
サーバーはアクセスを拒否します.他の人はサーバーを攻撃することができません.このように接続に失敗するのは正常です.戻ってきたデータを保存することができます.
サーバ側の問題.Flush、Close文が欠落していないかどうかを確認し、ここまで確実に実行します.サーバ側から例外が投げ出されることもあります(残念ながら、一部のプログラマーが書いたプログラムは例外を隠してデバッグできません).
==================================================
リファレンスソリューション1:
 write a bit about how Fiddler can "magically"fix things here: http://blogs.telerik.com/fiddler/posts/13-02-28/help!-running-fiddler-fixes-my-app-
The issue you're encountering is actually a bug in the .NET Framework itself. The rules of HTTP are such that the server may close a KeepAlive connection at any time after sending the first response (e.g. it doesn't need to accept another request on the connection, even if the client requested KeepAlive behavior).
.NET has a bug where it expects that the server will include a Connection: close response header if it will close the connection after the response is complete. If the server closes the connection without the Connection: Close header (entirely valid per RFC2616), .NET will encounter the closed connection when attempting to send the next request on the connection and it will throw this exception. What .NET should be doing is silently creating a new connection and resending the request on that new connection.
Fiddler resolves this problem because it doesn't care if the server closes the connection, and it keeps the connection to the client alive. When the client sends its second request, Fiddler attempts to reuse its connection to the server, notices that it's closed, and silently creates a new connection.
You can mitigate this problem in your code by:
  • Disabling keepalive on the request (this hurts performance)
  • Catching the exception and retrying automatically
  • Changing the server to keep connections alive longer

  • Approach #3 only works if you control the server and because the client may be behind a gateway/proxy that closes connections after use, you should probably use approach #2 as well.
    ソリューション2:
    Fiddler works as an Internet Proxy. If your code works while Fiddler is running, (and maybe also from a browser), then you may have a problem with your proxy settings.
    Fiddlerツールを使用すると、プログラムが動作します.IEのエージェント設定が間違っている可能性があります.FILDERはエージェントモードで動作しているからです.
    ソリューション3:
    私の例では、この問題を解決しました.
    System.Net.ServicePointManager.Expect100Continue = false;
    以上です.