ASP.Net WebApi STA模式

时间:2014-04-16 16:15:11

标签: c# asp.net asp.net-web-api asp.net-web-api2 apartment-state

post让WebApi无法在STA模式下运行。但是这篇文章也有2年了。

我一直在挖掘新的WebApi2,但似乎无法找到让MessageHandlers在STA模式下运行的方法。

那么有没有人找到在STA模式下运行WebApi或WebApi2的方法?

1 个答案:

答案 0 :(得分:5)

因此,如果您想将整个请求处理线程切换到STA模式,那么您最好使用MVC。但是,如果您的处理程序执行一次性任务并且不涉及将整个线程切换到STA模式,那么Web API使它非常简单。以下是我的表现方式:

public class StaHandler : DelegatingHandler
{
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        // consider moving it to singleton instance to improve performance
        var staTaskScheduler = new StaTaskScheduler(100);

        return Task.Factory.StartNew<HttpResponseMessage>(() =>
        {
            //somethign that does its magic and returns a HttpResponseMessag
            return new HttpResponseMessage();
        }, cancellationToken,
            TaskCreationOptions.None,
            staTaskScheduler);
    }
}

需要考虑的事项:

  • 创建StaTaskScheduler很重要。考虑将其移至单件或确保在App_Start
  • 期间仅初始化一次
  • 线程池大小(在我的示例中为100)也可以在这种扩展方面发挥作用。不幸的是,没有神奇的公式可以做到这一点。我创建了Web Performance Load Tests以找出我服务器上的最佳位置。