在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);
}
}
答案 0 :(得分:2)
在WebAPI Self-Host应用程序中,DelegatingHandler的SendAsync()方法和ApiController的任何方法是否总是在同一个线程上执行?
使用[ThreadStatic]变量将SessionId从SessionHandler传递给TestController是否安全?
不,不。 WebAPI上的async
将线程返回给运行时,因此管道中的任何异步(控制器操作,过滤器等)都可以在另一个线程上恢复。