Не удается заставить MassTransit с MSMQ работать с IIS Express

У меня есть веб-приложение .NET MVC 4, которое использует MassTransit с MSMQ. У нас есть несколько устаревших приложений, использующих MSMQ, поэтому я ограничен этим протоколом. Мой клиентский код в Application_Start() в файле global.asax.cs выглядит так:

Bus.Initialize(sbc =>
{
    sbc.UseMsmq(a => a.UseSubscriptionService("msmq://localhost/mt_subscriptions"));
    sbc.ReceiveFrom("msmq://localhost/webconsole?tx=false&recoverable=false");
    sbc.UseControlBus();
    sbc.UseBinarySerializer();
});

Я запускаю это приложение в окне разработчика Windows 8.1, и этот вызов успешно завершается, и связь работает, как и ожидалось, когда я запускаю его в IIS 8.5. Однако, когда я запускаю его в IIS Express 8.0, вызов никогда не завершается и в конечном итоге вызывает ошибку тайм-аута. Я нашел следующее в часто задаваемых вопросах IIS Express:

    Q: Does IIS Express support non-HTTP protocols such as net.tcp or MSMQ?

    A: No. IIS Express only supports HTTP and HTTPS as its protocol.

Хорошо, достаточно честно, но я не понимаю, какое отношение веб-сервер имеет к MSMQ (кроме использования MSMQ через HTTP, чего я не пытаюсь сделать); У меня нет маршрутов "msmq://" или чего-то подобного. Разве MassTransit не использует MSMQ напрямую, минуя веб-сервер? И я не могу поверить, что я единственный разработчик, который разрабатывает IIS Express с помощью MassTransit.

Любое понимание того, что здесь происходит? Спасибо!


person Mike Dailor    schedule 18.06.2014    source источник


Ответы (1)


Итак, я, наконец, понял это, я подумал, что опубликую ответ, чтобы, возможно, спасти кого-то еще от ударов головой об эту конкретную стену. Во время запуска MassTransit проверяет, доступны ли счетчики производительности Windows. По какой-то причине проверка их существования при работе в IIS Express приводит к зависанию вызова. Вы можете найти всю ветку обсуждения на эту тему здесь, это также было проблемой для разработчиков SignalR и Windsor Castle: https://groups.google.com/forum/#!topic/masstransit-discuss/Pz7ttS7niGQ. В результате обсуждения разработчики MassTransit добавили в свой API метод DisablePerformanceCounters(), и вызов этого метода при создании сервисной шины решил мою проблему.

person Mike Dailor    schedule 14.08.2015