我在我的ASP.NET MVC应用程序中设置并使用MiniProfiler。我的控制器通过WCF调用BLL,然后BLL与数据库进行通信。我希望看到WCF服务的分析以及我从Web应用程序中看到的现有分析。是否将MiniProfiler作为所有服务调用中的参数?
答案 0 :(得分:21)
在最近发布的MvcMiniProfiler中,他们添加了WCF支持(版本1.8或更高版本)。这是实现这一目标的三步过程:
首先通过nuget在UI层和WCF层添加对MvcMiniprofiler和MvcMiniProfiler.WCF的引用(或者下载源代码并编译自己的代码)。
其次,在服务主机的web.config中,您必须将miniprofiler添加为端点行为。所有配置部分都属于“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客户端以通过上面的相同操作“打开”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响应头中,而SOAP响应头又由WCF客户端读取。非常巧妙。
答案 1 :(得分:0)
这是一种方法,但是为了获得对库的引用,无论如何都必须在MvcMiniProfiler的较低层中添加引用。
我在同样的情况下所做的是利用MiniProfiler提供的全局访问点作为单例。所以,我刚刚添加了较低级别的引用(删除了相对于MVC的内容,例如视图),并且只使用了MiniProfiler.Current,就像我在上层一样。
它就像一个魅力。 :)