Joh*_*ell 8 .net wcf http fiddler
我有一个WPF
客户端通过WCF
托管的服务请求数据IIS 7
.服务方法SQL 2012
使用存储过程()EF
来检索一些数据.
需要加载大量数据,因此客户端会对服务方法进行多次调用,以"分解"数据加载并避免大量有效负载和超时.
我们使用从中扩展而来的生成的服务代理 System.ServiceModel.ClientBase<T>.
我们还使用带有二进制编码的自定义http绑定(从这里开始) - 这里显示的实际实现:
<customBinding>
<binding name="CustomBinding_IPointDataAccess" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00">
<binaryMessageEncoding maxReadPoolSize="64" maxWritePoolSize="16" maxSessionSize="2048">
<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="16384" />
</binaryMessageEncoding>
<httpTransport manualAddressing="false" maxBufferPoolSize="524288"
maxReceivedMessageSize="2147483647" allowCookies="false" authenticationScheme="Anonymous" bypassProxyOnLocal="false" decompressionEnabled="true" hostNameComparisonMode="StrongWildcard" keepAliveEnabled="true" maxBufferSize="2147483647" proxyAuthenticationScheme="Anonymous" realm="" transferMode="Buffered" unsafeConnectionNtlmAuthentication="false" useDefaultWebProxy="true" />
</binding>
Run Code Online (Sandbox Code Playgroud)
此外,在IIS中打开动态压缩.我可以在Fiddler中查看请求,并且消息正文的大小很好(~50KB),99%的请求在一两秒内返回.完善!
然而,几乎每次迭代都会有一个电话需要几分钟才能完成,而我不知道为什么......我sendTimeOut
在客户端的时间是1分钟,自然而然,一个电话会失败.我把它延长到10分钟,电话似乎在2分多钟内完成 - 虽然有时需要更长时间.这个问题看起来非常随机 - 可能是第一次通话,可能是第30次通话.但它非常可重复.
我在WCF服务方法中对存储过程调用进行了一些日志记录,并在一秒钟内执行并获取数据.所以,我不认为这是一个数据库问题.
使用Fiddler,有问题的调用生成类似于以下内容的输出:
ACTUAL PERFORMANCE
--------------
ClientConnected: 14:02:42.959
ClientBeginRequest: 14:03:01.224
GotRequestHeaders: 14:03:01.224
ClientDoneRequest: 14:03:01.574
Determine Gateway: 0ms
DNS Lookup: 0ms
TCP/IP Connect: 46ms
HTTPS Handshake: 0ms
ServerConnected: 14:05:16.021
FiddlerBeginRequest: 14:05:16.021
ServerGotRequest: 14:05:16.021
ServerBeginResponse: 14:03:04.784
GotResponseHeaders: 14:05:16.561
ServerDoneResponse: 14:05:16.611
ClientBeginResponse: 14:05:16.611
ClientDoneResponse: 14:05:16.611
Run Code Online (Sandbox Code Playgroud)
注意ServerBeginResponse
和之间的重要时间GotResponseHeaders
.这看起来与这里看到的问题非常相似.
我启用了WCF服务跟踪,并且快速浏览一下,没有任何错误或警告,但除了基础知识外,我无法理解我正在看的内容.
我怎样才能确定问题的所在和所在?是序列化吗?这是网络问题吗?服务器可以跟不上发送这么多请求的客户端吗?
我已经尝试通过添加适当的配置来调整配置文件中的WCF限制serviceBehaviors
,但这并没有什么区别.
我应该提一下,我通过VPN连接这样做,但其他的东西,如文件传输,远程桌面连接工作得很好.看起来很可靠.
如有必要,我可以提供更多细节.
编辑(6.10.2013):不确定这是否相关或只是侥幸,但有几次,我注意到在有问题的电话中,身体尺寸明显小于其他人.每次都不是这种情况,但它可能提供一些线索.这是来自Fiddler的屏幕截图,向您展示每次调用时Body尺寸的一致性.所选条目(#21)的尺寸远小于其他条目,但需要2分钟才能完成.
奇怪的是,这次我收到了一个例外.每次都不会发生异常.
System.ServiceModel.CommunicationException: The server did not provide a meaningful reply; this might be caused by a contract mismatch, a premature session shutdown or an internal server error.
Server stack trace:
at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs)
at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)
Exception rethrown at [0]:
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
Run Code Online (Sandbox Code Playgroud)
正如我在评论中建议的那样,请尝试将 transfermode 设置为 streamed 以排除这是与内存压力相关的问题的可能性(因为流模式应该导致 wcf 使用较少的内存)。
当我看到这个问题时,我怀疑这可能是问题所在,因为它似乎只发生在快速连续进行多次服务调用时。根据我的经验,这通常是两个问题之一:代理没有从客户端正确关闭,或者服务器由于内存压力而运行 GC。
当传输模式被缓冲时,WCF 会将消息响应的整个数据集加载到内存中,然后再将其发送回客户端。Streamed 简单地将数据发回而不进行缓冲。对于大数据集,它往往要快得多,对于小数据集,它会稍微慢一些,并且总是使用较少的内存(在服务器和客户端上)。
归档时间: |
|
查看次数: |
3490 次 |
最近记录: |