3

우리 서버에 연결을 열 때 WinRT 응용 프로그램의 속도가 매우 느립니다. 요청은 ~ 500ms가 소요됩니다. 이것은 일부 시나리오를 차단합니다.WinRT의 HttpClient 클래스에서 연결 유지 연결을 사용합니까?

디버깅 할 때 Fiddler가 활성화되어있을 때 요청이 훨씬 빠릅니다 (요청 당 100ms). 나중에 일부 검색은 Fiddler가 통화를 프록시 할 때 Keep-Alive 연결을 사용 중이기 때문에 우리의 프록시 된 통화가 훨씬 빨라 졌음을 알았습니다.

우리는 두 가지 방법으로 이것을 다시 확인했습니다.

  1. UseProxy를 false로 설정하고 요청이 천천히 진행되는 것을 관찰했습니다.
  2. Fiddler의 "연결 재사용"옵션을 해제하고 요청이 다시 느려지는 것을 관찰했습니다.

연결 헤더 (.Connection.Add ("Keep-Alive"))를 통해 연결 유지를 사용하려고했으나 아무런 효과가없는 것처럼 보입니다. 실제로 헤더가 무시 무시한 것처럼 보입니다. .NET 구성 요소이며 요청시 전송되지 않습니다 (다시 Fiddler를 검사하여).

누구나 Windows 8, WinRT, HttpClient 클래스의 요청에 대해 연결 유지를 설정하는 방법을 알고 있습니까?

+0

최저은 다음과 같습니다 http://stackoverflow.com/questions/14099812/httpclient-exception-in-windows-8-app 독서의 즐거움 또한 : 에 http : // MSDN .microsoft.com/korea/library/ystem.net.http.headers.httprequestheaders.aspx HTTP v 1.1을 사용하고 있습니까? 이 경우 Keep-Alive가 true로 설정되어야합니다. –

+0

예, 1.1을 사용합니다. 링크를 보내 주셔서 감사합니다. 첫 번째 방법이 어떻게 적용되는지는 모르지만 오류는 발생하지 않습니다. 두 번째 질문에 대해서는 - Connection 헤더를 사용해 보았습니다. - 헤더의 전체 목록이 도움이되는지 (미안) 잘 모르겠습니다. –

+0

Hehe, 아니요. 알아요.하지만 상황에 대한 두 번째 모습은 결코 알지 못합니다 .- 행운을 비네! –

답변

1

헤더를 추가 할 HttpContent 클래스를 사용하여 시도 -에 따라이 (하지만 검증되지 않은) 같은 http://social.msdn.microsoft.com/Forums/en-CA/winappswithcsharp/thread/ce2563d1-cd96-4380-ad41-6b0257164130

당신이 HttpClient를 겪고 있기 때문에 KeepAlive를 당신에게 직접 액세스 권한을 부여하지만 것 HttpClient를은 HttpWebRequest를 사용하는 장면 뒤에 당신 HttpWebRequest 클래스에서 해당 속성에 직접 액세스 할 수 없습니다.

 

public static async Task KeepAliveRequest() 
{ 
    var handler = new HttpClientHandler(); 
    var client = new HttpClient(handler as HttpMessageHandler); 

    HttpContent content = new StringContent(post data here if doing a post); 
    content.Headers.Add("Keep-Alive", "true"); 

    //choose your type depending what you are sending to the server 
    content.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded"); 

    HttpResponseMessage response = await client.PostAsync(url, content); 

    Stream stream = await response.Content.ReadAsStreamAsync(); 

    return new StreamReader(stream).ReadToEnd(); 
} 
 

편집 만 GET 원하기 때문에, 당신이 그렇게 할 수 있습니다

 

public static async Task KeepAliveRequest(string url) 
{ 
    var client = new HttpClient(); 
    var request = new HttpRequestMessage() 
    { 
     RequestUri = new Uri("http://www.bing.com"), 
     Method = HttpMethod.Get, 
    }; 
    request.Headers.Add("Connection", new string[] { "Keep-Alive" }); 
    var responseMessage = await client.SendAsync(request); 
    return await responseMessage.Content.ReadAsStringAsync(); 
} 

 
+0

답장을 보내 주셔서 감사합니다 ... 1. 우리는 POST를하고 있지 않으며 우리는 GET을하고 있고 서버는 이것을 확인하여 게시로 전환 할 수 없습니다.) 2. 왜 HttpClientHandler에서 "as HttpMessageHandler"를하고 있습니까? ? HttpClientHandler는 HttpMessageHandler입니다. –

+0

우리는 DefaultHeaders와 HttpRequestMessage의 변경을 통해 Keep-Alive 헤더를 추가하려고했습니다.그러나 요청 객체에서 직접 시도하지 않았습니다. 나는 그것을 시도 할 것이다. 그러나 다른 두 개의 메소드가 헤더에 요청을하지 않았으므로, 나는 큰 희망을 갖고 있지 않다. –

+0

나는 winrt 응용 프로그램에서 GET 요청에 대한 위의 정확한 코드를 테스트하고 Connection : Keep-Alive를 유일한 요청 헤더로 사용합니다. '내 컴퓨터에서 작동':) –

5

다음 세트의 올바른 헤더 나를 위해 연결 유지를 켭니다 (클라이언트 인 HttpClient를)

client.DefaultRequestHeaders.Connection.Clear(); 
client.DefaultRequestHeaders.ConnectionClose = false; 
// The next line isn't needed in HTTP/1.1 
client.DefaultRequestHeaders.Connection.Add("Keep-Alive"); 

당신이 연결 유지 끄고 사용하려면

내가 지금 찾을 수있는
client.DefaultRequestHeaders.Connection.Clear(); 
client.DefaultRequestHeaders.ConnectionClose = true;