我正在使用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与您的情况有关,请尝试一下。

10-08 07:55