簡體   English   中英

使用HttpClient發送兩個相隔2秒的POST請求

[英]Use HttpClient to send two POST requests 2 seconds apart

我正在嘗試為DelegatingHandler編寫一個集成測試,以防止重復請求。 處理程序檢查數據庫以查看請求是否已被處理,如果在前一個請求仍在運行時發出重復請求,則返回407-Conflict。

我的測試中有以下代碼:

HttpClient client = new HttpClient();
var responseTask1 = client.PostAsJsonAsync(RequestUriWithDuplicatePrevention, ReadRequestContent("DuplicateRequestJsonContent.json"));
var responseTask2 = client.PostAsJsonAsync(RequestUriWithDuplicatePrevention, ReadRequestContent("DuplicateRequestJsonContent.json"));

var response1 = responseTask1.Result;
var response2 = responseTask2.Result;

這兩個請求都在同一時間登錄到數據庫。 如何在一段時間內延遲第二次請求?

我試過添加一個Thread.Sleep(500),但它似乎沒有什么區別。

修訂后的守則

此代碼似乎在大多數時間都有效,但它不是100%可靠。

        [TestMethod]
    public void ShouldReturn407ConflictWhenDuplicateRequestSubmitted()
    {
        var results = ExecutePostRequests().Result;

        Assert.AreEqual(HttpStatusCode.OK, results[0].StatusCode);
        Assert.AreEqual(HttpStatusCode.Conflict, results[1].StatusCode);
    }

    private async Task<HttpResponseMessage[]> ExecutePostRequests()
    {
        HttpClient client = new HttpClient();

        var task1 = ExecutePost(client, 0);
        var task2 = ExecutePost(client, 4000);

        var response1 = await task1;
        var response2 = await task2;

        return new[] {response1, response2};
    }

    private async Task<HttpResponseMessage> ExecutePost(HttpClient client, int delay)
    {
        await Task.Delay(delay);
        return await client.PostAsync(RequestUriWithDuplicatePrevention,
            ReadRequestContent("DuplicateRequestJsonContent.json"));
    }

正在執行的Web服務具有Thread.Sleep(5000)。

原始代碼中的具體問題是, 在獲取結果之間 ,當您應該在啟動異步操作之間休眠時,它處於休眠狀態

它可以像這樣糾正:

var responseTask1 = client.PostAsJsonAsync(...);
Thread.Sleep(2000);
var responseTask2 = client.PostAsJsonAsync(...);

var response1 = responseTask1.Result;
var response2 = responseTask2.Result;

您修改后的代碼不會遇到此問題,應該可以使用。 雖然,我會改變這個:

    var response1 = await task1;
    var response2 = await task2;

    return new[] {response1, response2};

為了更有效:

    return await Task.WhenAll(task1, task2);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM