88

これらの「細かい」RFCは、ホストごとに2つ以上の接続を使用しないことに注意することをすべてのRFCクライアントから義務付けています...

Microsoft はこれを WebClient に実装しました。でオフにできることを知っています

App.config:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
 <system.net> 
  <connectionManagement> 
   <add address="*" maxconnection="100" /> 
  </connectionManagement> 
 </system.net> 
</configuration> 

( http://social.msdn.microsoft.com/forums/en-US/netfxnetcom/thread/1f863f20-09f9-49a5-8eee-17a89b591007にあります)

しかし、どうすればプログラムでそれを行うことができますか?

http://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.defaultconnectionlimit.aspxによると

「DefaultConnectionLimit プロパティを変更しても、既存の ServicePoint オブジェクトには影響しません。変更後に初期化された ServicePoint オブジェクトにのみ影響します。このプロパティの値が直接または構成を通じて設定されていない場合、値はデフォルトで定数 DefaultPersistentConnectionLimit に設定されます。」

WebClient をインスタンス化するときに制限を構成するのが最善ですが、プログラムの開始時にこの悲しい制限をプログラムで削除するだけでも問題ありません。

私がアクセスするサーバーは、インターネット上の通常の Web サーバーではなく、私の管理下にあるローカル LAN にあります。API 呼び出しを行いたいが、Web サービスやリモート処理を使用していない

4

5 に答える 5

120

興味のある方:

System.Net.ServicePointManager.DefaultConnectionLimit = x(ここで、x は希望する接続数です)

余計な参考書はいらない

上記の投稿で説明したように、サービス ポイントが作成される前に、これが呼び出されていることを確認してください。

于 2010-08-31T02:50:26.913 に答える
50

ここや他の場所からのいくつかのヒントを使用して、使用していた WebClient クラスをオーバーライドすることで、アプリケーションでこれを修正できました。

class AwesomeWebClient : WebClient {
    protected override WebRequest GetWebRequest(Uri address) {
        HttpWebRequest req = (HttpWebRequest)base.GetWebRequest(address);
        req.ServicePoint.ConnectionLimit = 10;
        return (WebRequest)req;
    }
}
于 2009-08-13T01:31:44.397 に答える
7

このソリューションでは、接続制限をいつでも変更できます。

private static void ConfigureServicePoint(Uri uri)
{
    var servicePoint = ServicePointManager.FindServicePoint(uri);

    // Increase the number of TCP connections from the default (2)
    servicePoint.ConnectionLimit = 40;
}

誰かがこのFindServicePointを初めて呼び出すと、ServicePointインスタンスが作成され、 ServicePointManager内でそれを保持するためにWeakReferenceが作成されます。同じ Uri に対するマネージャーへの後続の要求は、同じインスタンスを返します。その後接続が使用されない場合、GC はそれをクリーンアップします。

于 2015-01-12T21:14:41.810 に答える
5

WebClientで使用されているServicePointオブジェクトを見つけた場合は、その接続制限を変更できます。HttpWebRequestオブジェクトには、使用するように構築されたオブジェクトを取得するためのアクセサーがあるため、そのように行うことができます。運が良ければ、すべてのリクエストが同じServicePointを共有することになる可能性があるため、1回だけ実行する必要があります。

制限を変更するグローバルな方法を知りません。実行の早い段階でDefaultConnectionLimitを変更した場合は、おそらく問題ありません。

または、ほとんどのサーバーソフトウェアがとにかくあなたを抑制しようとしているので、接続制限をそのまま使用することもできます。:)

于 2009-05-14T23:40:47.470 に答える
4

App.Config の上記の構成に関する状況があります。

これを CONSOLE アプリケーションで有効にするために、System.Configuration 参照 dll を追加しました。参照がなければ、上記は役に立ちませんでした。

于 2010-02-26T23:39:10.537 に答える