У меня есть MiniProfiler, настроенный и работающий в моем приложении ASP.NET MVC. Мои контроллеры делают вызовы через WCF в BLL, который, в свою очередь, ведет переговоры с базой данных. Я хотел бы видеть профилирование из службы WCF наряду с существующим профилированием, которое я вижу из веб-приложения. Это случай, когда MiniProfiler является параметром во всех вызовах службы?
Веб-приложение профилирования MvcMiniProfiler и нижние слои
Ответ 1
В недавнем выпуске 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 для запуска всех управляемых модулей для всех запросов. Эта конфигурация находится в разделе "Конфигурация":
<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. Довольно изобретательный.
Ответ 2
Этот метод, но для того, чтобы получить ссылку на библиотеки, вам все равно придется добавлять ссылки в нижние уровни для MvcMiniProfiler.
То, что я сделал в этой же ситуации, - это использовать глобальную точку доступа, которую MiniProfiler предоставляет как одноэлементный. Итак, я просто добавил ссылку на нижние уровни (удалил материал относительно MVC, например, представления) и просто использовал MiniProfiler.Current, как если бы я был на верхних уровнях.
Это работает как шарм.:)