1

複数のファイルを連続して (場合によっては数千) ダウンロードする必要があるアプリケーションがあります。ただし、いくつかのファイルをダウンロードする必要がある場合、SocketException 型の内部例外とエラー コード 10048 (WSAEADDRINUSE) の例外が発生します。私はいくつかの掘り下げを行いましたが、基本的にはサーバーがソケットを使い果たしたためです(そして、それらはすべて再び利用可能になる前に240秒ほど待っています)-偶然ではなく、1024ファイル範囲の周りで発生し始めます. HttpWebRequest/ServicePointManager が接続を再利用していると思いますが、そうではないようです (ファイルは https であるため、その一部である可能性があります)。これが移植されたC++コードでこの問題を見たことはありません(しかし、それは決して起こらなかったという意味ではありません.

WebRequest オブジェクトを適切に閉じており、HttpWebRequest オブジェクトの KeepAlive はデフォルトで true に設定されています。次に私の意図は、ServicePointManager.SetTcpKeepAlive() をいじることです。しかし、この問題に遭遇していない人がどれほど多いかはわかりません。

他の誰かが問題に遭遇しましたか? もしそうなら、それを回避するために何をしましたか? 現在、このエラーを検出して待機する再試行スキームがありますが、それは正しいことではないようです。

私が何をしているのかを確認するための基本的なコードを次に示します (何かを閉じていない場合に備えて):

WebRequest webRequest = WebRequest.Create(uri);
webRequest.Method = "GET";
webRequest.Credentials = new NetworkCredential(username, password);

WebResponse webResponse = webRequest.GetResponse();
try
{
    using(Stream stream = webResponse.GetResponseStream())
    {
        // read the stream
    }
}
finally
{
    webResponse.Close()
}
4

2 に答える 2

1

これはどのようなアプリケーションですか? サーバーのポートが不足しているとのことでしたが、HttpWebRequest についても言及されました。このコードを Web サービスまたは ASP.NET ページで実行していて、クライアントからの同じ着信要求に対して複数のファイルをダウンロードしようとしていますか?

ページはどのような認証を使用していますか? NTLM 認証を使用している場合、使用されている資格情報が要求ごとに異なると、接続を共有できません。

私がお勧めするのは、資格情報ごとにリクエストをグループ化することです。したがって、たとえば、ユーザー名「John」を使用するすべてのリクエストがグループ化されます。サービス ポイントで「ConnectionGroupName」プロパティを指定できるため、システムは同じ資格情報とサーバーに対して接続を再利用しようとします。

それでもうまくいかない場合は、次の 1 つ以上を実行する必要があります。

1) リクエストを抑制します。

2) ワイルドカード ポート範囲を増やします。

3) ServicePoint で BindIPConnectionCallback を使用して、ワイルドカード以外のポート (つまり、1024 ~ 16384 の範囲のポート) にバインドします。

于 2010-03-23T14:09:30.213 に答える
0

さらに掘り下げると、認証が原因である可能性が指摘されているようで、 UnsafeAuthenticatedConnectionSharing プロパティがこれを軽減する可能性があります。ただし、それが最善かどうかもわかりません。

于 2010-03-23T00:17:24.227 に答える