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


88

이러한 "미세"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 호출을하고 싶지만 웹 서비스 나 원격을 사용하지 않습니다.


15
그것은 실제로 표준이 아닙니다. RFC는 클라이언트를 두 개의 연결로 제한하도록 "권장"하지만 실제로는 필수 사항은 아닙니다. 포스터는 한 번에 2 개 이상의 항목을 다운로드해야합니다.
Erik Funkenbusch

12
내 서버에서 API에 액세스합니다. 나는 인터넷의 호스트를 해치고 싶지 않습니다.
Christian

12
부하 테스트 도구를 구축하기 위해 연결 제한을 늘 렸습니다. 2 개의 메 즐리 연결로 부하 테스트를하는 것은 정말 어렵습니다. 많은 연결을 사용하는 비 브라우징 이유가 많이 있다고 확신합니다.
ScottS

1
BTW, 위의 구성은 웹 클라이언트뿐만 아니라 모든 .Net 제어 연결에 영향을 미칩니다.
ScottS

2
왜 두 개 이상입니까? 질문을 돌려 보겠습니다. 왜 동시에 비동기 적으로 서버에 두 개 이상의 요청을 발행 할 수 없습니까? 2는 말 그대로 한계입니다.
Csaba Toth 2013

답변:


50

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

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

28
이럴는 설정하는 것이 System.Net.ServicePointManager.DefaultConnectionLimit더 나은 솔루션입니다, 같이가 있다고 가정 할 수 없다 WebRequestA는 HttpWebRequest, 예를 들어, 그것은 될 수 있습니다 FileRequest.
Dennis

120

관심있는 분들을 위해 :

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

추가 참조가 필요 없음

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


그렇다면 이것이 전역의 application_start에 추가 될 수 있습니까? 모든 연결에 영향을 미칩니 까?
TheAlbear

System.Net.ServicePointManager.DefaultConnectionLimit = x를 추가하는 방법 및 위치는 무엇입니까?
Arul Sidthan

이상하게도 DefaultConnectionLimit (F12를 사용하여 탐색)에 대한 코드 주석은 기본값이 Int32.MaxValue라고 말합니다. 그러나 디버그 검사에 의해 주장 된대로 2입니다.
crokusek

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

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


1
FindServicePoint의 유일한 문제는 하나의 ServicePoint를 돌려 주지만 클라이언트가받는 동일한 ServicePoint인지 알 수 없다는 것입니다.
jeffa00

2
그것은 "문제"가 아니라 일의 정상적인 부분 일뿐입니다. 모든 솔루션과 마찬가지로이를 테스트 할 방법을 찾아야합니다. 내 방식은 .config의 설정을 "1"로 설정하고 끔찍한 성능을 관찰 한 다음 코드에서 설정하여 (여기와 같이) 향상된 성능을 관찰하는 것이 었습니다.
Abacus

1
ServicePoint후 (설정과 함께) 손실 됨MaxIdleTime
Colin Breame

5

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

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

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


이 서버는 완전히 내 통제하에 있기 때문에 (사실, 그럴 것이지만 다른 방식으로) 저를 제한하지 않습니다
Christian

1
많은 연결로 인해 서버가 스로틀 될 수 있지만 작은 서버 (제한된 VM에서 호스팅 됨)에서도이를 경험하지 못했습니다. 클라이언트 측의 제한 2는 다른 한편으로 저를 방해했습니다. 한계를 높이면 상황이 해방되었습니다.
Csaba Toth 2013

1
또한 오늘날의 브라우저가 HTTP 1.1 RFC의 제한 인 2를 따를 지 의심 스럽습니다.
Csaba Toth 2013

4

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.