3

この投稿により、WebApi が STA モードで実行できなくなります。しかし、この投稿も2歳です。

MessageHandlers私は新しい WebApi2 を掘り下げてきましたが、STA モードで実行する方法が見つからないようです。

WebApi または WebApi2 を STA モードで実行する方法を見つけた人はいますか?

4

1 に答える 1

6

したがって、リクエスト処理スレッド全体を STA モードに切り替えたい場合は、MVCを使用したほうがよいようです。ただし、スレッド全体を STA モードに切り替える必要のない 1 回限りのタスクをハンドラーが実行する場合は、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 中に 1 回だけ初期化されるようにします。
  • スレッド プール サイズ (私の例では 100) も、これがどれだけうまくスケールするかについて役割を果たすことができます。残念ながら、これを正しく行うための魔法の公式はありません。サーバーのスイート スポットを見つけるために、Web パフォーマンス ロード テストを作成しました。
于 2014-06-24T14:03:23.317 に答える