MvcMiniProfiler для профилирования веб-приложений и нижних уровней
У меня есть MiniProfiler, настроенный и работающий в моем приложении ASP.NET MVC. Мои контроллеры делают вызовы через WCF на BLL, который, в свою очередь, обращается к базе данных. Я хотел бы видеть профилирование из службы WCF наряду с существующим профилированием, которое я вижу в веб-приложении. Является ли случаем сделать MiniProfiler параметром во всех сервисных вызовах?
2 ответа
В недавнем выпуске MvcMiniProfiler была добавлена поддержка WCF (версия 1.8 или выше). Это трехэтапный процесс, чтобы заставить это работать:
Добавить ссылки
Сначала добавьте ссылки на MvcMiniprofiler и MvcMiniProfiler.WCF на вашем уровне пользовательского интерфейса и на уровне WCF через nuget (или загрузите исходный код и скомпилируйте свой собственный).
Настройка WCF Host
Во-вторых, в файле web.config хоста службы вы должны добавить минипрофиль в качестве поведения конечной точки. Все разделы конфигурации находятся в "configuration/system.serviceModel".
<endpointBehaviors>
<behavior name="miniProfilerBehavior">
<wcfMiniProfilerBehavior />
</behavior>
</endpointBehaviors>
Затем добавьте расширение поведения (обратите внимание, что номер версии должен соответствовать вашей версии MvcMiniProfiler.WCF):
<extensions>
<behaviorExtensions>
<add name="wcfMiniProfilerBehavior" type="MvcMiniProfiler.Wcf.WcfMiniProfilerBehavior, MvcMiniProfiler.Wcf, Version=1.8.0.0, Culture=neutral" />
</behaviorExtensions>
</extensions>
Затем настройте конечные точки для использования настроенного вами профилировщика:
<services>
<service behaviorConfiguration="BaseBehavior" name="BSI.Something">
<endpoint address="" behaviorConfiguration="miniProfilerBehavior" binding="basicHttpBinding" bindingConfiguration="http" contract="BSI.ISomething"/>
</service>
</services>
Зависит от вашей настройки, но мне пришлось добавить еще один параметр web.config для запуска всех управляемых модулей для всех запросов. Этот конфиг находится в корневом разделе "конфигурации":
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
Настройка клиента WCF
Наконец, настройте клиент wcf для "включения" профилировщика mvc, выполнив то же самое выше.
Добавьте расширение:
<extensions>
<behaviorExtensions>
<add name="wcfMiniProfilerBehavior" type="MvcMiniProfiler.Wcf.WcfMiniProfilerBehavior, MvcMiniProfiler.Wcf, Version=1.8.0.0, Culture=neutral" />
</behaviorExtensions>
</extensions>
Добавить поведение:
<behaviors>
<endpointBehaviors>
<behavior name="wcfMiniProfilerBehavior">
<wcfMiniProfilerBehavior />
</behavior>
</endpointBehaviors>
</behaviors>
Настройте конечные точки для использования этого поведения:
<client>
<endpoint address="http://something/Something.svc" behaviorConfiguration="wcfMiniProfilerBehavior"
binding="BasicHttpBinding" bindingConfiguration="BasicHttpBinding_HTTP"
contract="BSL.ISomething" name="BasicHttpBinding_ISomething" />
</client>
И вы сделали!
Примечание: как MvcMiniProfiler на самом деле работает над WCF? По сути, поведение клиента устанавливает заголовок SOAP, который указывает хосту wcf включить профилировщик. Он передает тот заголовок, по которому читается поведение конечной точки на стороне хоста WCF. Затем он включает профилировщик на хосте. Наконец, когда узел WCF отвечает клиенту, он добавляет все достоинства профилировщика в заголовок ответа SOAP, который, в свою очередь, читается клиентом WCF. Довольно гениально.
Это один из методов, но чтобы получить ссылку на библиотеки, вам все равно нужно добавить ссылки на нижних уровнях для MvcMiniProfiler.
То, что я сделал в этой же ситуации, - это использование глобальной точки доступа, которую MiniProfiler предоставляет в качестве одиночного устройства. Итак, я просто добавил ссылку на нижних уровнях (удалил материал, относящийся к MVC, например, представления) и просто использовал MiniProfiler.Current, как если бы я был на верхних уровнях.
Отлично работает.:)