【发布时间】:2021-02-15 15:17:36
【问题描述】:
我已经在 SO 中搜索了答案,但没有找到与手头问题相关的答案,尽管 this one 指出了“为什么”,但没有解决它。
我有一个 REST 端点,它需要从其他端点收集数据 - 在这样做时,它会访问 HttpContext(设置身份验证、标头等……所有这些都是通过我无法访问的 3rd 方库完成的)。
不幸的是,这个用于服务通信的库是同步的,我们希望并行化它的使用。
在下面的示例(抽象)代码中,问题是 CallEndpointSynchronously 不幸地使用了一些内置身份验证,当 HttpContext 未设置时会引发空异常:
public class MyController: ApiController
//...
[HttpPost]
public async Task<IHttpActionResult> DoIt(IEnumerable<int> inputs)
{
var tasks = inputs.Select(i =>
Task.Run(()=>
{
/* call some REST endpoints, pass some arguments, get the response from each.
The obvious answer (HttpContext.Current = parentContext) can't work because
there's some async code underneath (for whatever reasons), and that would cause it
to sometimes not return to the same thread, and basically abandon the Context,
again resulting in null */
var results = Some3rdPartyTool.CallEndpointSynchronously(MyRestEndpointConfig[i]);
return results;
});
var outcome = await Task.WhenAll(tasks);
// collect outcome, do something with it, render outputs...
}
有没有办法解决这个问题?
我们希望针对单个请求进行优化,目前对最大化并行用户不感兴趣。
【问题讨论】:
-
如果我理解this post中的Stephen Cleary,那基本上是做不到的……对吧?
-
它是什么框架? .NET 4、4.5?
-
好吧,如果它是 4.5 或更高版本,您可以尝试使用它 - bartwullems.blogspot.com/2013/09/… 不确定它是否适用于这种特定情况
-
@NikitaChayka:现在是 4.7.2
-
所以试试我提供的,可能会有所帮助,但再次 - 不确定