WCF客户端挂起响应

时间:2010-05-20 19:02:54

标签: c# wcf soap windows-7

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

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

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

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

我很茫然 - 我应该寻找什么?是否有一些配置设置可以解决这个问题?

任何帮助表示赞赏!

修改

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

7 个答案:

答案 0 :(得分:3)

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

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

我认为通过增加缓冲区大小(maxBufferSize="1000000")可以实现同样的效果,但我已经实现了这一点并且没有帮助。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

如果其他用户的提示无效,您可能需要Enable WCF Tracing并在Service Trace Viewer中将其打开。这些信息很详细,但它使我能够在过去修复一些难以识别的问题。

可以找到有关WCF跟踪的更多信息on MSDN

答案 3 :(得分:1)

你可以尝试两件事:

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

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

  3. // huusom

答案 4 :(得分:1)

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

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

接下来只需用一段代码解码返回的字符串,例如:

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

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

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

答案 5 :(得分:0)

要检查的第一件事:

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

修改

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

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

修改2

接下来要检查的事项:

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

答案 6 :(得分:0)

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