首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用HttpClient将两个POST请求分开2秒发送

使用HttpClient将两个POST请求分开2秒发送
EN

Stack Overflow用户
提问于 2013-11-06 01:57:12
回答 1查看 1.7K关注 0票数 0

我试图为防止重复请求的DelegatingHandler编写集成测试。处理程序检查数据库以查看请求是否已被处理,并返回407冲突,如果在前一个请求仍在运行时发出重复请求,则返回407冲突。

我的测试中有以下代码:

代码语言:javascript
运行
复制
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%可靠。

代码语言:javascript
运行
复制
        [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)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-06 05:02:24

原始代码中的具体问题是,它在获得结果之间处于休眠状态,而在启动异步操作之间应该处于休眠状态。

它可以这样加以纠正:

代码语言:javascript
运行
复制
var responseTask1 = client.PostAsJsonAsync(...);
Thread.Sleep(2000);
var responseTask2 = client.PostAsJsonAsync(...);

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

您修改过的代码不存在此问题,应该可以工作。不过,我会改变这一点:

代码语言:javascript
运行
复制
    var response1 = await task1;
    var response2 = await task2;

    return new[] {response1, response2};

为了更有效率:

代码语言:javascript
运行
复制
    return await Task.WhenAll(task1, task2);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19802667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档