2013-02-01 48 views
1

我有一种方法将一些数据发布到服务器。服务器可能会返回意味着我需要更改URL并将数据发送到其他服务器。我从4.5框架中为它使用HttpClient类。我使用do-while循环来重复请求,直到我不需要redirecton。但有一个问题。等待HttpClient和do-while循环

问题是为什么,如果我创建外循环HttpClient例如,第二await没有发生,我PROGRAMM走出循环,但如果我在循环中创建HttpClient实例连连 - 一切都很好?我可以重复使用一个HttpClient进行do-while循环内的异步方法中的几个POST请求吗?

我的工作代码示例:

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

我没有工作代码示例:

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

+0

好吧,你说它没有等待 - 发生了什么?有没有例外? –

+0

请注意,当您重复使用相同的HttpClient时,您将在一个会话中有效 - 这肯定会影响如何处理验证等。查看HTTP级别正在发生的事情会很有用,例如,与WireShark。 –

+0

我没有得到答案。我的应用程序离开了do-while和'GameLogin'方法 – Jagget

回答

4

好了,现在我们已经有了例外...

我怀疑问题是不重用HttpClient - 它的重用这样的:

var content = new StringContent(this.SendStr); 

我怀疑content很可能被设置由HttpClient第一次呼叫,这使第二次呼叫失败。

只需在循环内部移动该行(它位于工作代码中的循环内部),我希望一切都会好起来的。