3

这篇文章从能够在 STA 模式下运行的问题中剔除 WebApi。但是这篇文章也有2年的历史了。

我一直在研究较新的 WebApi2,但似乎找不到MessageHandlers在 STA 模式下运行的方法。

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

4

1 回答 1

6

因此,如果您想将整个请求处理线程切换到 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 性能负载测试来找出我的服务器上的最佳位置。
于 2014-06-24T14:03:23.317 回答