1

我有一种将一些数据发布到服务器的方法。服务器可能会返回 aswer 表示我需要更改 URL 并将数据发送到其他服务器。我使用HttpClient4.5 框架中的类。我使用任一 do-while 循环来重复请求,直到我不需要重定向。但有一个问题。

问题是为什么如果我HttpClient在循环外创建实例,第二次await没有发生并且我的程序退出循环,但是如果我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;
}

我的第二个代码没有await在第二个循环中等待。

4

1 回答 1

4

好的,现在我们有了例外...

我怀疑问题不在于重用HttpClient- 它正在重用:

var content = new StringContent(this.SendStr);

我怀疑这content可能是由HttpClient一次调用处理的,这使得第二次调用失败。

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

于 2013-02-01T21:03:34.473 回答