ASP.Net WebApi STA Mode

Этот пост не дает WebApi возможности работать в режиме STA. Но этому посту тоже 2 года.

Я копался в более новом WebApi2, но не могу найти способ сделать MessageHandlers работать в режиме STA.

Так кто-нибудь нашел способ запустить WebApi или WebApi2 в режиме STA?

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) также может играть роль в том, насколько хорошо это масштабируется. К сожалению, нет волшебной формулы, чтобы понять это правильно. Я создал нагрузочные тесты веб-производительности, чтобы выяснить расположение моих серверов.
Другие вопросы по тегам