2010-05-20 131 views
3

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

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

我可以从提琴手看到响应快速回来,但然后WCF客户端挂起响应本身超过一分钟下一行代码被调试器击中之前,几乎如果客户端有麻烦反序列化。只有在响应中我有一个给定的pdf字符串(操作生成pdf)时,才会发生这种情况,base64编码为分块。如果例如服务引发错误(因此pdf字符串不存在),那么响应立即被反序列化。

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

我不知所措 - 我应该寻找什么,有没有一些配置设置可以做到这一点?

任何帮助表示赞赏!

编辑

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

回答

3

更改transferMode="Buffered"transferMode="Streamed"绑定上做的伎俩!

因此,有效载荷显然被分成了缓冲区大小的小数位。

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

1

我已经有这个咬我多次。检查你的WCF客户端配置,你没有尝试使用Windows Web代理,那么检查代理的步骤(即使没有配置一个)会在连接过程中耗费大量时间。

+0

THX!我该怎么做 - 有什么具体的设置我需要检查? – JohnIdol 2010-05-20 22:34:59

+0

useDefaultWebProxy =“false”不好 - 仍在发生 - 其他建议? – JohnIdol 2010-05-21 09:31:11

+0

对不起,当我从真到假改变了我的速度问题。 – 2010-05-21 14:12:02

0

首先需要检查的事项:

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

编辑

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

我想知道问题是否在别的地方。对WCF服务的调用一切正常,但是调用在一个事务中,并且事务没有完成或者处理(我在这里猜测),然后在等待超时的时候事务/代码会挂起1分钟。

编辑2

接下来的事情来检查:

  • 有代码中的任何区别是测试,并在Web项目,该服务是如何被调用。
  • 是否有框架版本的任何differnce,例如是3.0和3.5等
+0

thx - binding + endpoint是完全相同的,并且服务引用也完全相同。我正在同一个环境中从同一台机器进行所有测试。唯一不同的是,这只发生在web proj中。没有检查记忆 - 会尝试并寻找尖峰。 – JohnIdol 2010-05-23 16:37:08

+0

一个有趣的事情是,即使我看到响应立即回来与提琴手WCF跟踪在反序列化完成后记录请求/响应对 - 1分钟后(它显示事务花了超过1分钟完成) – JohnIdol 2010-05-23 17:52:08

+0

对此感到抱歉 - 没有涉及此类交易。通过交易,我的意思是请求/响应对。截至目前,我认为问题在于pdf字符串是base64编码的。 – JohnIdol 2010-05-24 17:59:22

1

如果其他用户的提示不帮忙,你可能想Enable WCF Tracing并在Service Trace Viewer打开。这些信息是详细的,但它使我能够在过去修复一些难以确定的问题。

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

+0

我已经迷上了,但无法找到任何奇怪的东西。如果我有线索寻找什么,会更容易。 – JohnIdol 2010-05-23 16:38:31

+0

如果日志文件足够小,请尝试将其添加到您的问题测试中。如果没有,你可以发送给我[email protected](显然我的实际名称),我会看看。 – 2010-05-24 12:39:45

0

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

+0

thx,但“悬挂”发生之前,它甚至没有达到(顺便说一句,内容类型已经指定为你建议) – JohnIdol 2010-05-25 12:08:55

1

两件事你可以尝试:

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

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

// huusom

+0

已经试图捕捉所有的例外,没有运气 - 也试图最大限度地把所有的读者配额,也没有运气! :( – JohnIdol 2010-05-26 12:50:51

+0

这越来越有趣:) 是否有可能我们可以看到客户端和服务规范的配置? – Huusom 2010-05-26 13:31:29

+0

发现问题!看到我自己的答案 - 我喜欢你回答,所以+1 – JohnIdol 2010-05-26 14:34:23

1

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

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

接着简单地与自己的一段代码诸如解码返回的字符串:

字节[]文件= Convert.FromBase64String(pdfBase64String);

要下载70KB的PDF,以前需要〜6秒。有了上面的建议更改,现在需要< 1秒。

五,

PS:关于转方式,我曾尝试只改变客户端(transferMode =“StreamedResponse”),但没有改善......

+0

有趣,thx - 我通过在客户端上设置transferMode =“Streamed”解决,因为这是我唯一可以访问的东西 – JohnIdol 2010-08-20 17:33:36