方案
我需要在网页上显示N个报告。需要向外部服务请求报告。服务生成报告的时间可能从2秒到50秒不等,具体取决于请求的内容。
要调用该服务,我在异步操作中使用 HttpClient 。要生成1个报告,我将服务调用一次。要生成5个报告,我称之为5次,依此类推。
问题
假设我们要求3个报告 BigReport,MediumReport 和 SmallReport ,其已知相对生成时间为1分30秒2秒,我们按以下顺序呼叫服务:
BigReport , MediumReport , SmallReport
HttpCalls的结果如下:
基本上,尽管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;我需要寻找。到目前为止,我的问题是:
非常感谢。