2015-03-02 65 views
2

在的WebAPI自我主機的應用程序,將SendAsync DelegatingHandler()方法和ApiController的任何方法總是相同的線程上執行?的WebAPI:DelegatingHandler和ApiController在同一線程上?

使用[ThreadStatic]變量將SessionHandler的RequestId傳遞給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); 
    } 
} 

回答

2

在的WebAPI自主機應用程序,將SendAsync DelegatingHandler()方法和ApiController的任何方法總是在同一線程上執行?

是可以安全使用[ThreadStatic]變量從SessionHandler傳遞的requestId到的TestController?

沒有,沒有。 WebAPI上的async將線程返回到運行時,因此管道中的任何異步(控制器操作,過濾器等)都可能在另一個線程上恢復。