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

MVC HttpClient multiple post requests, get mismatched responses

场景

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

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

问题

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

BigReport, MediumReport, SmallReport

HttpCalls 的结果如下:

基本上,虽然HttpCalls不同,但由于它们是在很短的时间内发出的,而且它们仍然是"active",服务器会根据先到后响应,首先服务,而不是为每个调用提供准确的响应。

代码

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

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

});

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

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

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

结论与问题

这个问题本身是有道理的,在用 Fiddler 检查它之后,因为我们有多个打开的 HttpRequests 几乎同时挂起。 我想我需要一种 handlersomething 来识别和匹配 request/response,但我不知道它的名字是什么我需要寻找的"domain"。到目前为止,我的问题是:

非常感谢。

延迟 "bit",我 post 解决方案。

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

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