1

サーバーにデータを POST する方法があります。サーバーは、URL を変更して他のサーバーにデータを送信する必要があることを意味します。HttpClient私は4.5フレームワークのクラスを使用しています。do-while ループを使用して、リダイレクトが不要になるまでリクエストを繰り返します。しかし問題がある。

問題は、HttpClientループの外側でインスタンスを作成すると、2 番目にawait発生せず、プログラムがループから抜け出すのですがHttpClient、ループの内側でインスタンスを何度も作成すると、すべて問題ないのはなぜですか? HttpClient非同期メソッド内の do-while ループ内の複数の POST 要求に対して1 つを再利用できますか?

私の作業コードサンプル:

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

そして、私の 2 番目のコードは、2 番目のawaitループ ターンで待機しませんでした。

4

1 に答える 1

4

さて、これで例外が発生しました...

問題は再利用されていないのではないかと思いますHttpClient-これを再利用しています:

var content = new StringContent(this.SendStr);

contentおそらくHttpClient最初の呼び出しによって破棄されているのではないかと思います。これにより、2 番目の呼び出しが失敗します。

その行をループ内に移動するだけです (作業コードのループ内にあります)。すべてがうまくいくと思います。

于 2013-02-01T21:03:34.473 に答える