質問

This post scratches off WebApi from being able to run in STA mode. But this post is also 2 years old.

I've been digging into the newer WebApi2 but can't seem to find a way to make MessageHandlers run in STA mode.

So has anyone found a way of running WebApi or WebApi2 in STA mode?

役に立ちましたか?

解決

So it seems that if you want to switch the entire request processing thread to STA mode, you're better off with MVC. However, if your handler does a one off task that doesn't involve switching the entire thread into STA mode, Web API makes it pretty easy. Here's how I did it:

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);
    }
}

Things to consider:

  • Creating StaTaskScheduler is heavy. Consider moving it to a singleton or ensure it is initialized only once during App_Start
  • Thread Pool Size (100 in my example) can also play a role in how well this scales. Unfortunately, there is no magic formula to get this right. I created Web Performance Load Tests to figure out a sweet spot on my servers.
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top