2

サードパーティの Web API を呼び出して、サードパーティ側のデータの一部を更新しています。立て続けに 5 件のジョブを送信しましたが、最初の 2 件のリクエストは確実に正常に機能しています。ただし、最後の 3 つは更新されません。アプリケーションは、リクエストがタイムアウトしていることを示しているようですが、自分の側で何かを台無しにしないようにしたいと考えています。

以下の関数を で呼び出しており、API を非同期で呼び出すためにAction<string, Dictionary<string,object>> Delegate使用しています。BeginInvoke反応はあまり気にしません。私は何かを誤解WebRequest.GetResponse()していますか、それともエンドポイントの問題ですか?

    private void UpdateJobInfo(string jobId, Dictionary<string, object> updates)
    {
        var postData = GetJsonEncodedValues(updates);
        var request = WebRequest.Create(string.Format(JobResultEndpoint, _username, jobId));

        request.ContentType = "application/json; charset=utf-8";
        request.Method = WebRequestMethods.Http.Put;
        request.Headers[HttpRequestHeader.Authorization] = GetAuthenticationCredentials();
        request.GetRequestStream().Write(Encoding.ASCII.GetBytes(postData), 0, Encoding.ASCII.GetBytes(postData).Length);

        request.GetResponse();
    }
4

1 に答える 1

4

あなたは応答を破棄していません(または実際には要求ストリームですが、それは少し異なる問題です)。つまり、ファイナライザーがたまたま応答をファイナライズできることに気付くまで、サーバーへの接続を開いたままにしておくということです。接続は (デフォルトで) URL ごとに 2 つの接続でプールされます。したがって、後のリクエストは、接続を取得する前に、以前のレスポンスが完了するのを待っています。

より良いコード:

// Is this definitely what you want? What about non-ASCII data?
byte[] binaryPostData = Encoding.ASCII.GetBytes(postData);
using (var requestStream = request.GetRequestStream())
{
    requestStream.Write(binaryPostData, 0, binaryPostData.Length);
}

using (var response = request.GetResponse())
{
    // We don't care about the response, but we have to fetch it
    // and dispose it.
}
于 2013-04-05T19:34:57.317 に答える