У меня настроен MiniProfiler и он работает в моем приложении ASP.NET MVC. Мои контроллеры звонят через WCF в BLL, который, в свою очередь, общается с базой данных. Я хотел бы видеть профилирование из службы WCF наряду с существующим профилированием, которое я вижу в веб-приложении. Можно ли сделать MiniProfiler параметром во всех вызовах службы?
MvcMiniProfiler профилирует веб-приложение и нижние уровни
Ответы (2)
В последнем выпуске MvcMiniProfiler добавлена поддержка WCF (версия 1.8 или выше). Это трехэтапный процесс, чтобы заставить это работать:
Добавить ссылки
Сначала добавьте ссылки на MvcMiniprofiler и MvcMiniProfiler.WCF в свой уровень пользовательского интерфейса и слой WCF с помощью nuget (или загрузите исходный код и скомпилируйте свой собственный).
Настройка хоста WCF
Во-вторых, в файле 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 для запуска всех управляемых модулей для всех запросов. Этот конфиг находится в корневом разделе «configuration»:
<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. Довольно изобретательно.
<add name="WcfMiniProfilerBehavior" type="StackExchange.Profiling.Wcf.WcfMiniProfilerBehavior, MiniProfiler.Wcf" />
- person UserControl; 18.12.2012
Это один из способов, но для того, чтобы получить ссылку на библиотеки, вам все равно придется добавить ссылки на нижние уровни для MvcMiniProfiler.
Что я сделал в той же самой ситуации, так это воспользовался глобальной точкой доступа, которую MiniProfiler предоставляет как синглтон. Итак, я просто добавил ссылку на нижние уровни (удалив материал, относящийся к MVC, например представления) и просто использовал MiniProfiler.Current, как если бы я был на верхних уровнях.
Работает как часы. :)