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