【问题标题】:ASP.Net WebApi STA ModeASP.Net WebApi STA 模式
【发布时间】:2014-04-16 16:15:10
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    所以看来,如果你想将整个请求处理线程切换到 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 来找出我服务器上的最佳位置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-15
    • 2021-08-16
    相关资源
    最近更新 更多