2013-08-27 2 views
7

자체 호스팅 프로세스로 실행되는 웹 API를 사용하여 REST 리소스를 만들었습니다. 성능상의 이유로 영구 HTTP 연결을 사용하여 호출 할 수 있기를 바랍니다. 나는 OWIN 자체 호스팅을 사용하고 있습니다.System.Net.Http.HttpClient에서 영구 연결을 사용할 수 있습니까?

System.Net.Http.HttpClient에서 GET, POST, PUT, DELETE에 대한 asnyc 메서드를 정말 좋아합니다. 그들은 쉽게 호출하고 처리 할 수 ​​있습니다. System.Threading.Tasks.Task를 반환합니다.이 작업은 내가하려는 일에 편리합니다. 나는 System.Net.HttpWebRequest에 HttpClient를 사용하는 것을 선호한다.

아마도 뭔가가 빠졌지 만 HttpClient와 영구 연결을 만드는 방법을 쉽게 알 수 없습니다. System.Net.Http.HttpClientHandler 및 System.Net.Http.WebRequestHandler 클래스를 파고 있지만 영구 연결에 대한 옵션을 찾지 못했습니다. Google은 HttpWebRequest를 사용하여 영구 연결을 만드는 모든 종류의 예제를 찾습니다. true로 설정할 수있는 KeepAlive 속성이 있습니다. HttpClient로 이것을 설정할 수있는 방법이 있습니까?

MSDN documentation for HttpClient

:

기본적으로는, HttpWebRequest를 서버에 요청을 보내는 데 사용됩니다. HttpMessageHandler 인스턴스를 매개 변수로 사용하여 생성자 오버로드 중 하나에서 다른 채널을 지정하면이 동작을 수정할 수 있습니다. 인증 또는 캐싱과 같은 기능이 필요한 경우 WebRequestHandler를 사용하여 설정을 구성하고 인스턴스를 생성자에 전달할 수 있습니다. 반환 된 핸들러는 HttpMessageHandler 매개 변수를 사용하여 생성자 오버로드 중 하나로 전달 될 수 있습니다.

기본 HttpWebRequest에 KeepAlive 기능을 설정하는 방법이 있습니까?

MSDN 설명서는 말한다 :

HttpClient를 클래스의 인스턴스가 HTTP 요청을 보내 세션 역할을합니다. HttpClient 인스턴스는 해당 인스턴스에서 실행되는 모든 요청에 ​​적용되는 설정 모음입니다. 또한 모든 HttpClient 인스턴스는 고유 한 연결 풀을 사용하여 다른 HttpClient 인스턴스에 의해 실행 된 요청에서 해당 요청을 격리합니다.

성능 혜택을 얻을 수있을 때 연결 풀이 나를 위해 영구 연결을 사용하여 최적화한다는 것을 알고 있습니까? 내 고객으로부터 단 하나의 연결 만이 존재하도록하려면 어떻게해야합니까?

+0

안녕에 대한 연결을 설정할 수 있습니다! 마침내 가능한지 알아 냈습니까? – vtortola

+0

내가 이것을 보았던 지 꽤 오래되었습니다. 내가 아는 한, 그것은 불가능합니다. 나는 많은 것을 시도했지만, 내가 무엇을 시도했는지에 상관없이, http.sys는 트래픽이 없기 때문에 120 초 후에 연결을 끊었습니다. HTTP KeepAlive 또는 다른 어떤 것으로 낮은 수준의 동작을 수정하기 위해 .NET 계층에서 연결을 구성하는 방법을 찾지 못했습니다. 나는 누군가가 대답으로 차임을하고 싶습니다. – petrsnd

+0

충분히 좋습니다. 감사. – vtortola

답변

0

정확히 어떤 문제를 해결하려고하는지 모르지만 SignalR을 살펴 보셨습니까? 그들은 당신이 찾고있는 일을 할 수있는 꽤 멋진 websocket api를 가지고 있습니다.

.NET 4.5를 사용하지 않는 경우 대체 메커니즘이 있습니다. 내가 사용중인 것으로 보이는 것은 서버/이벤트 스트림과 같은 것이다.

+0

나는 왜 -1인지 모르겠다. 그러나 당신이 나의 충고를 따랐다면 IHttpClient 구현이 흥미로울 것 같다. – Developer

0

클라이언트의 ServicePoint에서 MaxIdle 시간을 설정해야합니다. 가장 쉬운 방법은 모든 서비스 지점에 대한 시간 제한을 설정하는 것입니다 :

ServicePointManager.MaxServicePointIdleTime = Timeout.Infinite; 

또한 특정 엔드 포인트

var sp = ServicePointManager.FindServicePoint(targetUri); 
sp.MasIdleTime = Timeout.Infinite; 
관련 문제