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

时间:2015-12-10 12:48:27

标签: c# asp.net-mvc asynchronous async-await dotnet-httpclient

方案

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

要调用该服务,我在异步操作中使用 HttpClient 。要生成1个报告,我将服务调用一次。要生成5个报告,我称之为5次,依此类推。

问题

假设我们要求3个报告 BigReport,MediumReport SmallReport ,其已知相对生成时间为1分30秒2秒,我们按以下顺序呼叫服务:

BigReport MediumReport SmallReport

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

});

如果我将操作从异步转换为同步,一切正常,通过删除异步任务而不是等待&#34;等待&#34;对于回复,我只是得到结果

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

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

结论和问题

在与Fiddler一起检查之后,问题本身也有意义,因为我们几乎同时挂起了多个打开的HttpRequests。 我想我需要一种处理程序某些来识别和匹配请求/响应,但我不知道&的名称是什么#34;结构域&#34;我需要寻找。到目前为止,我的问题是:

  • &#34;并行多个http呼叫&#34;?
  • 的技术名称是什么?
  • 如果问题可以理解,问题的名称是什么? (并发,并行请求排队等等。?)
  • 当然,有什么解决方案吗?

非常感谢。

0 个答案:

没有答案