WebAPI:DelegatingHandler和ApiController在同一个线程上?

时间:2015-03-02 15:28:24

标签: asp.net multithreading asp.net-web-api

在WebAPI Self-Host应用程序中,DelegatingHandler的SendAsync()方法和ApiController的任何方法是否总是在同一个线程上执行?

使用[ThreadStatic]变量将SessionId从SessionHandler传递给TestController是否安全?

示例:

public class TestController : ApiController
{
    [HttpGet]
    public string Run()
    {
        LogManager.GetLogger("Controller").InfoFormat("Thread id: {0} ", Thread.CurrentThread.ManagedThreadId);
        return "Bar";
    }
}

public class SessionHandler : DelegatingHandler
{
    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        LogManager.GetLogger("SessionHandler").InfoFormat("Thread id: {0} ", Thread.CurrentThread.ManagedThreadId);
        return await base.SendAsync(request, cancellationToken);
    }
}

1 个答案:

答案 0 :(得分:2)

  

在WebAPI Self-Host应用程序中,DelegatingHandler的SendAsync()方法和ApiController的任何方法是否总是在同一个线程上执行?

     

使用[ThreadStatic]变量将SessionId从SessionHandler传递给TestController是否安全?

不,不。 WebAPI上的async将线程返回给运行时,因此管道中的任何异步(控制器操作,过滤器等)都可以在另一个线程上恢复。