This post http://weblog.west-wind.com/posts/2012/Sep/18/Creating-STA-COM-compatible-ASPNET-Applications使 WebApi 无法在 STA 模式下运行。但这篇文章也有2年历史了。
我一直在研究较新的 WebApi2 但似乎找不到一种方法MessageHandlers http://www.asp.net/web-api/overview/working-with-http/http-message-handlers在 STA 模式下运行。
那么有人找到了在 STA 模式下运行 WebApi 或 WebApi2 的方法吗?
所以看来如果你想将整个请求处理线程切换到STA模式,你最好这样做MVC http://weblog.west-wind.com/posts/2012/Sep/18/Creating-STA-COM-compatible-ASPNET-Applications。但是,如果您的处理程序执行一项一次性任务,不涉及将整个线程切换到 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 性能负载测试 http://msdn.microsoft.com/en-us/library/vstudio/dd293540%28v=vs.110%29.aspx找出我的服务器上的最佳位置。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)