【问题标题】:WCF client hangs on responseWCF 客户端挂起响应
【发布时间】:2010-05-20 19:02:53
【问题描述】:

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

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

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

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

我不知所措 - 我应该寻找什么,是否有一些配置设置可以解决问题?

任何帮助表示赞赏!

编辑:

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

【问题讨论】:

    标签: c# wcf soap windows-7


    【解决方案1】:

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

    因此,有效负载显然被分成缓冲区大小的小块。

    我认为通过增加缓冲区大小 (maxBufferSize="1000000") 也可以达到同样的效果,但我已经这样做了,但没有帮助。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 谢谢!我该怎么做 - 我需要检查任何特定设置吗?
      • useDefaultWebProxy="false" 不好 - 仍在发生 - 还有其他建议吗?
      • 抱歉,当我将我的从 true 更改为 false 时,它​​解决了我的速度问题。
      【解决方案3】:

      如果其他用户的提示没有帮助,您可能想Enable WCF Tracing 并在Service Trace Viewer 中打开它。这些信息很详细,但它使我能够解决过去的一些难以识别的问题。

      有关 WCF 跟踪的更多信息,请访问on MSDN。

      【讨论】:

      • 我已经把它连接起来了,但没有发现任何奇怪的东西。如果我知道要查找的内容会更容易。
      • 如果日志文件足够小,请尝试将其添加到您的问题测试中。如果没有,您可以通过 firstname@firstnamelastname.com 将其发送给我(显然是我的真实姓名),我会看看。
      【解决方案4】:

      你可以尝试两件事:

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

      2. 在调试选项中禁用“仅我的代码”。工具 -> 选项 -> 调试 -> 常规“仅启用我的代码(仅限托管)”并查看是否可以捕获内部 WCF 异常。

      //huusom

      【讨论】:

      • 已经尝试捕获所有异常但没有运气 - 还尝试最大化所有读者配额但也没有运气! :(
      • 这越来越有趣了 :) 我们是否有可能看到客户端和服务规范的配置?
      • 发现问题了!看看我自己的答案 - 不过我喜欢你的答案,所以 +1
      【解决方案5】:

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

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

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

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

      要下载 70KB 的 PDF,过去需要大约 6 秒。使用上面建议的更改,现在需要

      V.

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

      【讨论】:

      • 有趣,谢谢 - 我通过在客户端设置 transferMode="Streamed" 解决了,因为这是我唯一可以访问的东西
      【解决方案6】:

      首先要检查:

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

      编辑

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

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

      编辑 2

      接下来要检查的事项:

      • 在测试代码和 Web 项目中,在调用服务的方式上是否有任何区别。
      • 框架版本是否有差异,例如一个3.0另一个3.5

      【讨论】:

      • thx - 绑定+端点完全相同,服务引用也完全相同。我在相同的上下文中从同一台机器上做所有的测试。我们唯一的区别是这只发生在网络项目中。未检查内存 - 将尝试检查并查找峰值。
      • 一件有趣的事情是,即使我看到 fiddler 立即返回响应,WCF 跟踪也会在反序列化完成后记录请求/响应对 - 1 分钟后(它显示事务花费了超过 1 分钟完成)
      • 很抱歉造成混淆 - 不涉及此类交易。交易是指请求/响应对。截至目前,我认为问题在于 pdf 字符串是 base64 编码的。
      • 查看我对问题的最后编辑 - 我认为可以排除字符串的编码(并且确实没有任何意义)
      • 服务的调用方式没有区别(通过完全相同的服务引用)-框架版本是完全相同的,实际上测试和 Web 项目在同一个解决方案中
      【解决方案7】:

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

      【讨论】:

      • thx,但“挂起”发生在它甚至没有到达之前(顺便说一句,内容类型已经按照你的建议指定)
      猜你喜欢
      • 2013-11-13
      • 1970-01-01
      • 1970-01-01
      • 2015-03-23
      • 2012-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多