我正在使用Azure函数,并且需要将HttpRequestMessage传递给被调用的async / await函数的整个链。在这种情况下,我可以改用AsyncLocal吗?
共享代码:
public class ApiController
{
public static AsyncLocal<HttpRequestContext> httpContext = new AsyncLocal<HttpRequestContext>();
[FunctionName("api")]
public static async Task<HttpResponseMessage> RunAsync(
[HttpTrigger(AuthorizationLevel.Anonymous, "GET", "POST", Route = "{requestType}/{source?}")]
HttpRequestMessage req,
string source,
string requestType,
TraceWriter logger)
{
HttpRequestContext requestContext = new HttpRequestContext(req, requestType, source);
httpContext.Value = requestContext;
return await RequestRouter.Dispatch();
}
}
在上面的代码中,我也想在Dispatch()中访问httpContext。我担心并发会发生什么?如果触发了新请求,此方法的上下文是否会更改?
最佳答案
它应该工作。 AsyncLocal
将在并发调用之间保留上下文。我进行了快速测试,它能够按预期保留请求。
函数通常很小且很简单,所以我会默认使用更简单的方式来传递上下文,通常只是传递参数。但是,如果AsyncLocal
与您的情况有关,请尝试一下。