WebClient의 2 연결 제한을 프로그래밍 방식으로 제거하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/866350

문제

그 "미세한"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 개체에만 영향을 미칩니다.이 속성의 값이 직접 또는 구성을 통해 설정되지 않은 경우, 값 기본값은 상수 기본값 기본적으로 연결됩니다."

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;
}

누구든지 가장 먼저 전화를 걸었습니다 findservicepoint, ㅏ 서비스 포인트 인스턴스가 생성되고 a 약한 참조 내부를 붙잡기 위해 만들어졌습니다 ServicePointManager. 동일한 URI에 대한 관리자에게 후속 요청은 동일한 인스턴스를 반환합니다. 연결이 사용되지 않으면 GC가 정리합니다.

WebClient에서 사용하는 ServicePoint 객체를 찾으면 연결 제한을 변경할 수 있습니다. httpwebrequest 객체는 사용하기 위해 만들어진 제품을 검색 할 수있는 액세서가 있으므로 그렇게 할 수 있습니다. 운이 좋으면 모든 요청이 동일한 ServicePoint를 공유 할 수 있으므로 한 번만 수행하면됩니다.

한계를 변경하는 전 세계적 방법을 모릅니다. 실행에 충분히 기본 공동 정보를 조기에 변경하면 괜찮을 것입니다.

또는 대부분의 서버 소프트웨어가 어쨌든 당신을 스로틀로 만들기 때문에 연결 제한으로 살 수 있습니다. :)

App.Config의 위 구성에 관한 상황이 있습니다.

콘솔 애플리케이션에서 유효하려면 System.configuration 참조 DLL을 추가했습니다. 참조가 없으면 위는 쓸모가 없었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top