MvcMiniProfiler профилирует веб-приложение и нижние уровни

У меня настроен MiniProfiler и он работает в моем приложении ASP.NET MVC. Мои контроллеры звонят через WCF в BLL, который, в свою очередь, общается с базой данных. Я хотел бы видеть профилирование из службы WCF наряду с существующим профилированием, которое я вижу в веб-приложении. Можно ли сделать MiniProfiler параметром во всех вызовах службы?


person doss    schedule 23.09.2011    source источник


Ответы (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. Довольно изобретательно.

person Paul Lemke    schedule 26.09.2011
comment
Как примечание для всех, кто ищет, что на Nuget нет пакетов MvcMiniProfiler.WCF или MiniProfiler.WCF, вам придется получить исходный код и скомпилировать проект самостоятельно. - person runxc1 Bret Ferrier; 12.01.2012
comment
Кроме того, они изменили пространства имен. Для 2.0.4 использую <add name="WcfMiniProfilerBehavior" type="StackExchange.Profiling.Wcf.WcfMiniProfilerBehavior, MiniProfiler.Wcf" /> - person UserControl; 18.12.2012
comment
Обновление. MiniProfiler.WCF теперь доступен в Nuget. - person codenheim; 15.03.2014
comment
Эта настройка работает только для привязок HTTP. Я пытаюсь заставить это работать с привязками net.tcp, опубликую здесь, как только заработаю. - person Adriano Machado; 16.03.2014

Это один из способов, но для того, чтобы получить ссылку на библиотеки, вам все равно придется добавить ссылки на нижние уровни для MvcMiniProfiler.

Что я сделал в той же самой ситуации, так это воспользовался глобальной точкой доступа, которую MiniProfiler предоставляет как синглтон. Итак, я просто добавил ссылку на нижние уровни (удалив материал, относящийся к MVC, например представления) и просто использовал MiniProfiler.Current, как если бы я был на верхних уровнях.

Работает как часы. :)

person Alpha    schedule 26.09.2011