[.net] WebClient에서 2 개의 연결 제한을 프로그래밍 방식으로 제거하는 방법

이러한 “미세”RFC는 모든 RFC 클라이언트에서 호스트 당 2 개 이상의 연결을 사용하지 않도록주의해야합니다.

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에 있음 )

그러나 프로그래밍 방식으로 어떻게 할 수 있습니까?

에 Accordin
http://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.defaultconnectionlimit.aspx

“DefaultConnectionLimit 등록 정보를 변경해도 기존 ServicePoint 객체에는 영향을주지 않습니다. 변경 후 초기화 된 ServicePoint 객체에만 영향을줍니다.이 등록 정보의 값이 직접 또는 구성을 통해 설정되지 않은 경우 기본값은 DefaultPersistentConnectionLimit 상수로 설정됩니다.”

WebClient를 인스턴스화 할 때 제한을 구성하는 것이 가장 좋지만 프로그램을 시작할 때 프로그래밍 방식으로이 슬픈 제한을 제거하는 것도 괜찮습니다.

내가 액세스하는 서버는 인터넷의 일반 웹 서버가 아니라 내가 제어하고 로컬 LAN에 있습니다. API 호출을하고 싶지만 웹 서비스 나 원격을 사용하지 않습니다.



답변

여기와 다른 곳의 몇 가지 팁을 사용하여 사용중인 WebClient 클래스를 재정 의하여 응용 프로그램에서이 문제를 해결할 수있었습니다.

class AwesomeWebClient : WebClient {
    protected override WebRequest GetWebRequest(Uri address) {
        HttpWebRequest req = (HttpWebRequest)base.GetWebRequest(address);
        req.ServicePoint.ConnectionLimit = 10;
        return (WebRequest)req;
    }
}


답변

관심있는 분들을 위해 :

System.Net.ServicePointManager.DefaultConnectionLimit = x (여기서 x는 원하는 연결 수)

추가 참조가 필요 없음

위에서 언급했듯이 서비스 지점이 생성되기 전에 이것이 호출되는지 확인하십시오.


답변

이 솔루션을 사용하면 언제든지 연결 제한을 변경할 수 있습니다 .

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

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

1 시간 사람이 호출 FindServicePoint 하는 ServicePoint의 인스턴스가 생성되고 WeakReference를가 내부 그것에에 저장하기 위해 만든됩니다 ServicePointManager을 . 동일한 Uri에 대해 관리자에 대한 후속 요청은 동일한 인스턴스를 반환합니다. 이후에 연결이 사용되지 않으면 GC가 연결을 정리합니다.


답변

WebClient에서 사용중인 ServicePoint 개체를 찾으면 연결 제한을 변경할 수 있습니다. HttpWebRequest 개체에는 사용하도록 구성된 개체를 검색 할 수있는 접근자가 있으므로 그렇게 할 수 있습니다. 운이 좋으면 모든 요청이 동일한 ServicePoint를 공유 할 수 있으므로 한 번만 수행하면됩니다.

한계를 변경하는 글로벌 방법을 모릅니다. 실행 초기에 DefaultConnectionLimit을 변경했다면 아마 괜찮을 것입니다.

또는 대부분의 서버 소프트웨어가 어쨌든 당신을 제한 할 것이기 때문에 당신은 연결 제한을 가지고 살 수 있습니다. 🙂


답변

App.Config에서 위의 구성과 관련된 상황이 있습니다.

이것이 CONSOLE 애플리케이션에서 유효하도록 System.Configuration 참조 dll을 추가했습니다. 참조가 없으면 위의 내용은 쓸모가 없었습니다.


답변