MVC HttpClient多个post请求,得到不匹配的响应

Posted

技术标签:

【中文标题】MVC HttpClient多个post请求,得到不匹配的响应【英文标题】:MVC HttpClient multiple post requests, get mismatched responses 【发布时间】:2015-12-10 12:48:26 【问题描述】:

场景

我需要在网页上显示 N 个报告。需要向外部服务请求报告。服务生成报告的时间可能从 2 秒到 50 秒不等,具体取决于请求的内容。

为了调用服务,我在 async 操作中使用 HttpClient。为了生成 1 份报告,我调用了一次服务。为了生成 5 个报告,我调用了 5 次,以此类推。

问题

假设我们请求 3 个报告 BigReport、MediumReportSmallReport,已知相对生成时间分别为 1 分 30 秒和 2 秒,我们调用该服务以下顺序:

大报告中报告小报告

HttpCalls 的结果如下:

BigReport 的 HttpCall 响应返回 SmallReport(生成速度最快) MediumReport 将是正确的 SmallReport 响应将包含 BigReport(最长也是最后一个)

基本上,虽然 HttpCalls 是不同的,但由于它们是在很短的时间内发出的,而且它们仍然“活跃”,服务器将根据 先到先得的方式进行响应,而不是为每个呼叫提供确切的响应。

守则

我有一个带有如下异步操作的请求控制器:

public async Task<string> GenerateReport(string blockContent)

    var formDataContent = new MultipartFormDataContent
    
        AddStringContent(userid, "userid"),
        AddStringContent(passcode, "passcode"),
        AddStringContent(outputtype, "outputtype"),
        AddStringContent(submit, "submit")
    ;

    var blockStream = new StreamContent(new MemoryStream(Encoding.Default.GetBytes(blockContent)));
    blockStream.Headers.Add("Content-Disposition", "form-data; name=\"file\"; filename=\"" + filename + "\"");
    formDataContent.Add(blockStream);

    using (var client = new HttpClient())
    
        using(var message = await client.PostAsync(Url, formDataContent))
        
             var report = await message.Content.ReadAsStringAsync();

             return report;
        
    

正在通过 Ajax 从视图调用操作,如下所示

//FOREACH BLOCK, CALL THE REPORT SERVICE
$('.block').each(function(index, block) 

    var reportActionUrl = "Report/GenerateReport/"+block.Content;

    //AJAX CALL GetReportAction
    $(block).load(reportActionUrl);

);

如果我通过删除异步任务而不是“等待”响应,将操作从异步转换为同步,一切正常,我只是得到结果

var result = client.PostAsync(Url, formDataContent).Result.

这将使一切同步运行并正常工作,但用户的等待时间会更长。我真的很想通过并行调用或类似方法来避免这种情况。

结论和问题

问题本身是有道理的,在使用 Fiddler 进行检查后,我们几乎同时有多个打开的 HttpRequests 待处理。 我想我需要一种 handlersomething 来识别和匹配请求/响应,但我不知道我需要查看的“域”的名称是什么为了。到目前为止,我的问题是:

“并行进行多个http调用”的技术名称是什么? 如果问题是可以理解的,那么问题的名称是什么? (并发、并行请求排队等?) 当然,有什么解决办法吗?

非常感谢。

【问题讨论】:

通常,无论您使用同步还是异步 IO,调用都应该是并行的。它们是并行的,因为请求是独立的,并且没有任何东西将它们序列化。你怎么知道请求不是并行处理的?您的 Fiddler 测试似乎正好相反。 或者是响应混淆的问题?在这种情况下,您调用的报告服务已损坏。贴出它的代码。使用 Fiddler 确保它返回错误的结果。 问题是响应混淆了。 Fiddler 清楚地显示了这个问题。那么你认为这不是正常的行为吗?然后,如果我删除异步行为,就会出现一种“死锁”,应用程序会等待第一次调用完全完成,然后再开始第二次调用。这样做的响应不会不匹配。我希望这是有道理的。 什么系统混淆了响应?我知道这里有两种服务。 你能写出 $reportBlock.load 的样子吗?它在做什么,它是如何发出 ajax 请求和填充数据的? 【参考方案1】:

稍微延迟一下,我发布解决方案。

问题是文件名参数被错误地称为 filename 而不是 blockname。这导致了非常奇怪的行为,因为一个文件可能有很多块。

吸取的教训是,如果出现非常奇怪的行为,在这种情况下使用 HttpClient 调用,分析所有可能的参数并使用不同的值对其进行测试,即使它没有太大意义。在最坏的情况下,它可能会引发错误。

【讨论】:

以上是关于MVC HttpClient多个post请求,得到不匹配的响应的主要内容,如果未能解决你的问题,请参考以下文章

HttpClient发送请求后得到的响应内容出现部分乱码的问题

浅谈SpringMvc HttpMessageConverter

用HttpClient的post模拟搜索结果只有正常结果的一部分

取消 'HttpClient' POST 请求

httpclient 中post请求重定向

httpclient的post请求超时