Веб-приложение профилирования MvcMiniProfiler и нижние слои

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

Ответы

Ответ 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, как если бы я был на верхних уровнях.

Это работает как шарм.:)