WCF客户端挂起响应

我有一个指向WebSphere服务的WCF客户端(在Win7上运行)。

从测试工具(我的Web应用程序之外的一个小测试夹具)开始,一切都很好但是当我对服务的调用来自我的web项目时,其中一个调用(并且只有那个调用)反序列化的速度非常慢(需要几分钟VS秒)而不仅仅是第一次

我可以从fiddler看到响应快速返回,但是在调试器遇到下一行代码之前,WCF客户端挂起响应本身超过一分钟 ,几乎如果客户端反序列化有问题。 只有在响应中我有一个给定的pdf字符串(操作生成一个pdf),base64编码的chunked时才会发生这种情况。 例如,如果服务引发了错误(因此pdf字符串不存在),则立即反序列化响应。

再次,如果我通过Soap-UI或从Web项目外部发送完全相同的信封,一切都很好。

我很遗憾 – 我应该寻找什么,是否有一些配置设置可能会有所作为?

任何帮助赞赏!

编辑

我根据相同的服务合同编写了一个存根。 使用完全相同的basicHttpBinding并返回完全相同的pdf字符串,没有注册延迟。 我认为这排除了字符串和绑定作为可能的原因。 还剩什么?

transferMode="Buffered"更改为transferMode="Streamed"绑定就可以了!

因此,有效载荷显然是以缓冲区大小的小块进行分块。

我认为通过增加buffersize( maxBufferSize="1000000" )可以实现同样的效果,但我已经实现了它并且它没有帮助。

我曾多次咬过我这个。 检查您的WCF客户端配置,您没有尝试使用Windows Web代理,检查代理的步骤(即使没有配置)将在连接期间耗费大量时间。

如果其他用户的提示没有帮助,您可能需要启用WCF跟踪并在服务跟踪查看器中将其打开。 这些信息很详细,但它使我能够在过去修复一些难以识别的问题。

有关WCF跟踪的更多信息可以在MSDN上找到。

你可以尝试两件事:

  1. 调整客户端的readerQoutas设置。 请参阅http://msdn.microsoft.com/en-us/library/ms731325.aspx

  2. 在调试选项中禁用“Just My Code”。 工具 – >选项 – >调试 – >常规“启用我的代码(仅管理)”,看看是否可以捕获内部WCFexception。

// huusom

我遇到了同样的问题…… WCF,IMO的问题在于将服务返回的base64字符串反序列化到byte []客户端。

如果您不能更改服务配置(例如:使用transferMode =“Streamed”),最容易解决此问题的方法是调整DataContract / ServiceContract客户端。 在Response DataContract中将“byte []”替换为“string”。

接下来,使用一段代码自行解码返回的字符串,例如:

byte [] file = Convert.FromBase64String(pdfBase64String);

要下载70KB的PDF,过去需要~6秒。 根据上面的建议更改,现在需要<1秒。

V.

PS。:关于传输模式,我确实只尝试改变客户端(transferMode =“StreamedResponse”),但没有改进……

首先要检查的事情:

  • 在Web项目和测试项目中配置是否相同?
  • 当您从SOAP UI进行测试时,您是从同一服务器以及与从Web项目运行代码时相同的安全上下文中进行测试的。 – 当pdf回来时,内存中是否有任何峰值?

编辑

从你的评论1分钟等待,似乎它正在等待超时。 你还提到交易。

我想知道问题是否在其他地方。 对WCF服务的调用是正常的,但是调用是在事务内部,并且事务上没有完成或处理(我在这里猜测),然后事务/代码将在等待超时时挂起1分钟。

编辑2

接下来要检查的事情:

  • 测试和Web项目中的代码是否与调用服务有何不同。
  • 框架版本是否有任何差异,例如一个3.0和另一个3.5

是否客户端试图分析来自服务器端的内容类型? 尝试在服务器端明确指定服务响应的mime类型,例如Response.ContentType = "application/pdf"编辑:客户端我指的是任何可能的中介,如防火墙或安全套件。