Режим ASP.Net WebApi STA

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

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

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


person Mrchief    schedule 16.04.2014    source источник


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