我正在创建一个WCF服务器 - 客户端应用程序。但是,在我的第一次测试中,一个简单的调用(该方法基本上只是return true;
)需要花费很多时间(~5秒)
我试图追踪它,这是呼叫追踪的屏幕截图
正如你在第2行和第3行之间看到的那样,时间为5秒(虽然老实说我不知道第2行和第3行是什么意思)
在客户端(调用者)的配置中,绑定是这样的(主要由Visual Studio生成
<wsHttpBinding>
<binding name="WSHttpBinding_IAgent" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text"
textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="false" />
<security mode="None">
</security>
</binding>
</wsHttpBinding>
并在服务器上
<wsHttpBinding>
<binding name="WSHttpBinding_IAgent" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:05:00" sendTimeout="00:05:00"
bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="16777216" maxReceivedMessageSize="16777216"
messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
allowCookies="false">
<readerQuotas maxDepth="32" maxStringContentLength="16777216"
maxArrayLength="16384" maxBytesPerRead="16384" maxNameTableCharCount="16384" />
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="false" />
<security mode="None"/>
</binding>
我称之为像这样的方式
var client = new AgentClient(binding, BuildEndpointAddress(hostName, port));
for(int i =0; i<10; i++)
client.IsAlive(); //this call is very slow despite just returning true;
// subsequent calls are also slow so probably not because of wake-up time
注意此测试,服务器和客户端都在同一台计算机上,因此不会出现网络问题。不知道是什么导致了这种缓慢或如何找到更多信息来解决这个问题?
答案 0 :(得分:1)
您的帖子中未指定应用程序生命周期,我将假设您启动客户端应用程序并在第一时间调用WCF服务而不会使其升温。
在这种情况下,时机是有意义的。
尽管使用了轻量级绑定和消息,但是如果没有预热,.NET会做很多隐藏的工作来初始化ChannelFactory和Server。这就是WCF的本质,不应该引起太多问题,因为在热身通信之后真的很快。
尝试在一个应用会话中连续两次呼叫您的服务,以测量两个呼叫的时间。 如果两个呼叫都花费相同的时间,我的假设是错
如果您想查看我的问题并比较环境 -
答案 1 :(得分:0)
要查找更多信息,您可能希望利用BCL团队的codeplex站点中的Perfmonitor工具利用Windows事件跟踪(ETW)。该工具的众多功能之一是它可以每毫秒对指令指针进行采样,并为每个样本提供托管调用堆栈。这可能会让您了解代码在这些时间段内所做的工作。
PS。这是使用此工具的文章的另一个链接: http://naveensrinivasan.com/category/net/etw-net/
答案 2 :(得分:0)
尝试配置WCF跟踪记录 - 详细信息请参见:http://msdn.microsoft.com/en-us/library/ms733025.aspx
我在WCF上遇到了各种各样的拔毛问题,但同一盒子上的那种性能问题并不是我以前见过的。正如其他人所说,最可能的原因是服务器的“升温”,但如果你多次调用它,那么这应该不是问题。您是否尝试过在客户端应用中多次调用代码?