2013-02-01 3 views
1

서버에 데이터를 POST하는 메소드가 있습니다. 서버가 aswer를 반환 할 수 있습니다. URL을 변경하고 다른 서버로 데이터를 보내야합니다. 나는 4.5 프레임 워크에서 HttpClient 클래스를 사용한다. 리디렉션이 필요하지 않을 때까지 do-while 루프를 사용하여 요청을 반복합니다. 그러나 문제가 있습니다.HttpClient 및 do-while 루프 기다리기

나는 일어나지 않았다 await초 루프 외부 HttpClient 인스턴스를 생성하고 내 programm에 루프에서 얻을 수 있지만, 만약 내가 다시하고 다시 루프 내부에 HttpClient 인스턴스를 만드는 경우 왜 질문은 - 모든 괜찮? 비동기 메서드 내부의 do-while 루프 안에 여러 POST 요청에 하나의 HttpClient을 재사용 할 수 있습니까?

내 작업 코드 샘플 :

public async Task<bool> GameLogin() 
{ 
    var clientHandler = new HttpClientHandler 
    { 
     CookieContainer = this.myCContainer, 
     AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate, 
    }; 
    var client = new HttpClient(clientHandler); 
    client.DefaultRequestHeaders.Add("client-ver", Versoin); 
    client.DefaultRequestHeaders.Add("method", "SignIn"); 
    client.DefaultRequestHeaders.Add("authKey", AppParams["auth_key"].ToString()); 

    var content = new StringContent(this.SendStr); 

    JToken r; 
    do 
    { 
     var answer = await client.PostAsync(this.CurrentUrl, content); 
     var rawString = await answer.Content.ReadAsStringAsync(); 
     DinamicData = JObject.Parse(rawString); 
     r = DinamicData["r"]; 
     if (r == null) continue; 
     this.CurrentUrl = string.Format("http://{0}/main.ashx", r); 
    } while (r != null); 

    return DinamicData.Type != JTokenType.Null; 
} 

을 그리고 내 두 번째 코드는 secont 루프 차례로 await을 기다리지 않았다

public async Task<bool> GameLogin() 
{ 
    JToken r; 
    do 
    { 
     var clientHandler = new HttpClientHandler 
     { 
      CookieContainer = this.myCContainer, 
      AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate, 
     }; 
     var client = new HttpClient(clientHandler); 
     client.DefaultRequestHeaders.Add("client-ver", Versoin); 
     client.DefaultRequestHeaders.Add("method", "SignIn"); 
     client.DefaultRequestHeaders.Add("authKey", AppParams["auth_key"].ToString()); 

     var content = new StringContent(this.SendStr); 

     var answer = await client.PostAsync(this.CurrentUrl, content); 
     var rawString = await answer.Content.ReadAsStringAsync(); 
     DinamicData = JObject.Parse(rawString); 
     r = DinamicData["r"]; 
     if (r == null) continue; 
     this.CurrentUrl = string.Format("http://{0}/main.ashx", r); 
    } while (r != null); 

    return DinamicData.Type != JTokenType.Null; 
} 

내 코드 샘플을 작동하지 않았다.

+0

그럼 당신은 기다리지 않았다고 말합니다 - 무슨 일이 일어 났습니까? 예외가 있었습니까? –

+0

동일한 HttpClient를 재사용 할 때 사실상 하나의 세션에 있다는 점에 유의하십시오. 이는 인증 등이 어떻게 처리되는지에 영향을 줄 수 있습니다. HTTP 레벨에서 어떤 일이 일어나는지 살펴 보는 것이 유용 할 것입니다. WireShark와. –

+0

나는'대답 '을 얻지 못했습니다. 내 앱이'GameLogin' 메소드의 do-while 및 out을 벗어난다. – Jagget

답변

4

자, 이제 우리가있어 제외 ...

내가 문제가 HttpClient 재사용하지 않는 생각 - 그것은이 재사용 것 :

var content = new StringContent(this.SendStr); 

내가 content 아마 배치되고 있다는 의심 HttpClient첫 번째 호출에 의해 두 번째 호출이 실패하게됩니다.

루프 내부에서 해당 줄을 이동하면 (작업 코드의 루프 내부에 있음) 모든 항목이 정상적으로 작동 할 것으로 예상됩니다.