MVC HttpClient 多个 post 请求,得到不匹配的响应
MVC HttpClient multiple post requests, get mismatched responses
场景
我需要在网页上显示 N 份报告。需要向外部服务请求报告。服务生成报告的时间从 2 秒到 50 秒不等,具体取决于请求的内容。
为了调用我在 async 操作中使用 HttpClient 的服务。为了生成 1 份报告,我调用了该服务一次。为了生成 5 份报告,我调用了 5 次,依此类推。
问题
假设我们请求 3 个报告 BigReport、MediumReport 和 SmallReport,已知相对生成时间为 1 分钟、30 秒和 2秒,我们按以下顺序调用服务:
BigReport, MediumReport, SmallReport
HttpCalls 的结果如下:
- BigReport 的 HttpCall 响应returnsSmallReport(生成速度最快)
- 中等报告将是正确的
- SmallReport 响应将包含 BigReport(最长也是最后一个)
基本上,虽然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 几乎同时挂起。
我想我需要一种 handler 或 something 来识别和匹配 request/response,但我不知道它的名字是什么我需要寻找的"domain"。到目前为止,我的问题是:
- "making multiple http calls in parallel" 的技术名称是什么?
- 如果问题可以理解,问题的名称是什么? (并发、并行请求排队等。?)
- 当然还有,有什么解决办法吗?
非常感谢。
延迟 "bit",我 post 解决方案。
问题是文件名参数被错误地称为 filename 而不是 blockname。这导致了非常奇怪的行为,因为一个文件可能有很多块。
吸取的教训是,如果出现非常奇怪的行为,在本例中使用 HttpClient 调用,请分析所有可能的参数并使用不同的值对其进行测试,即使它没有太大意义。在最坏的情况下,它可能会引发错误。
场景
我需要在网页上显示 N 份报告。需要向外部服务请求报告。服务生成报告的时间从 2 秒到 50 秒不等,具体取决于请求的内容。
为了调用我在 async 操作中使用 HttpClient 的服务。为了生成 1 份报告,我调用了该服务一次。为了生成 5 份报告,我调用了 5 次,依此类推。
问题
假设我们请求 3 个报告 BigReport、MediumReport 和 SmallReport,已知相对生成时间为 1 分钟、30 秒和 2秒,我们按以下顺序调用服务:
BigReport, MediumReport, SmallReport
HttpCalls 的结果如下:
- BigReport 的 HttpCall 响应returnsSmallReport(生成速度最快)
- 中等报告将是正确的
- SmallReport 响应将包含 BigReport(最长也是最后一个)
基本上,虽然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 几乎同时挂起。 我想我需要一种 handler 或 something 来识别和匹配 request/response,但我不知道它的名字是什么我需要寻找的"domain"。到目前为止,我的问题是:
- "making multiple http calls in parallel" 的技术名称是什么?
- 如果问题可以理解,问题的名称是什么? (并发、并行请求排队等。?)
- 当然还有,有什么解决办法吗?
非常感谢。
延迟 "bit",我 post 解决方案。
问题是文件名参数被错误地称为 filename 而不是 blockname。这导致了非常奇怪的行为,因为一个文件可能有很多块。
吸取的教训是,如果出现非常奇怪的行为,在本例中使用 HttpClient 调用,请分析所有可能的参数并使用不同的值对其进行测试,即使它没有太大意义。在最坏的情况下,它可能会引发错误。