ターゲット マシンが積極的に接続を拒否するため、接続を確立できなくなります。
P粉268654873
2023-08-20 12:40:57
<p>Web サービスに対して HttpWebRequest を実行すると、次のエラーが発生することがあります。以下にコードもコピーしました。 </p>
<pre>System.Net.WebException: リモート サーバーに接続できません ---> System.Net.Sockets.SocketException: ターゲット コンピューターが 127.0.0.1:80 を積極的に拒否したため、接続を確立できませんでした
System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress ソケットアドレス) で
System.Net.Sockets.Socket.InternalConnect(エンドポイントリモートEP)で
System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure、Socket s4、Socket s6、Socket&ソケット、IPAddress&アドレス、ConnectSocketState状態、IAsyncResult asyncResult、Int32タイムアウト、Exception&例外)
--- 内部例外スタック トレースの終了 ---
System.Net.HttpWebRequest.GetRequestStream() で
</pre>
<pre class="brush:php;toolbar:false;">ServicePointManager.CertificatePolicy = new TrustAllCertificatePolicy();
HttpWebRequest リクエスト = (HttpWebRequest)WebRequest.Create(url);
request.PreAuthenticate = true;
request.Credentials = networkCredential(sla);
request.Method = WebRequestMethods.Http.Post;
request.ContentType = "アプリケーション/x-www-form-urlencoded";
request.Timeout = v_Timeout * 1000;
if (url.IndexOf("asmx") > 0 && parStartIndex > 0)
{
AppHelper.Logger.Append("#############" sla.ServiceName);
using (StreamWriter reqWriter = new StreamWriter(request.GetRequestStream()))
{
その間(真)
{
int Index01 = parList.Length;
int Index02 = parList.IndexOf("=");
if (parList.IndexOf("&") > 0)
Index01 = parList.IndexOf("&");
文字列parName = parList.Substring(0,index02);
文字列parValue = parList.Substring(index02 1、index01 -index02 - 1);
reqWriter.Write("{0}={1}", HttpUtility.UrlEncode(parName), HttpUtility.UrlEncode(parValue));
if (index01 == parList.Length)
壊す;
reqWriter.Write("&");
parList = parList.Substring(index01 1);
}
}
}
それ以外
{
request.ContentLength = 0;
}
応答 = (HttpWebResponse)request.GetResponse();</pre>
<p><br /></p>
これが常に発生する場合は、実際にはマシンは存在するが、指定されたポートでリッスンしているサービスがないか、ファイアウォールがブロックしていることを意味します。
これが時々発生し (「時々」という言葉を使いましたが)、再試行が成功する場合は、サーバーの「バックログ」がいっぱいである可能性が高くなります。
リッスンソケットで受け入れられるのを待っている間、バックログに置かれます。このバックログは有限で非常に短いため、値が 1、2、または 3 になることも珍しくありません。そのため、オペレーティング システムは、リクエストをキューに入れて使用を「受け入れる」ことができない可能性があります。
バックログは
listen
関数のパラメータです。この点に関しては、C# であっても、すべての言語とプラットフォームが基本的に同じ API を持っています。サーバーを制御する場合、このパラメータは通常構成可能であり、構成ファイルまたはレジストリから読み取られる場合があります。サーバーを構成する方法を学びます。サーバーを作成した場合は、ソケットの受け入れで重い処理が行われる可能性があります。これを別のワーカー スレッドに移動して、受け入れが常に接続を受信できるようにする方がよいでしょう。クライアント側でのキューイングと逐次処理を軽減するために、さまざまなアーキテクチャ オプションを検討できます。
関係なく、サーバーのバックログを増やすことができるかどうかに関係なく、クライアント コードではこれに対処するために retryロジックが必要になります。バックログが長く、その時点でもサーバーは他のポートに対する多くのリクエストを受信する可能性があります。
NAT ルーターでマップされたポートが不足すると、まれにこのエラーが発生する可能性があります。ただし、ルーターは容量が不足する前に同じ宛先アドレス/ポートに対して 64K の同時接続を確立できるため、これはあまりにも可能性が低いと思います。