我有一个指向WebSphere服务的WCF客户端(在Win7上运行)。
从测试工具(我的网络应用程序之外的一个小测试夹具)一切都很好但是当我对服务的调用来自我的web项目时,其中一个调用(并且只有那个调用)的反序列化非常慢(需要分钟VS秒)和不仅仅是第一次。
我可以从fiddler看到响应快速返回但是 WCF客户端挂起响应本身超过一分钟,然后调试器下一行代码被命中,几乎如果客户端无法反序列化。只有在响应中我有一个给定的pdf字符串(操作生成一个pdf),base64编码的chunked时才会发生这种情况。例如,如果服务引发了错误(因此pdf字符串不存在),则立即反序列化响应。
同样,如果我通过Soap-UI或从Web项目外部发送完全相同的信封,那么一切都很好。
我很茫然 - 我应该寻找什么?是否有一些配置设置可以解决这个问题?
任何帮助表示赞赏!
修改:
我根据相同的服务合同编写了一个存根。使用完全相同的basicHttpBinding并返回完全相同的pdf字符串,没有注册延迟。我认为这排除了字符串和绑定作为可能的原因。还剩下什么?
答案 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)
你可以尝试两件事:
调整客户端的readerQoutas设置。请参阅http://msdn.microsoft.com/en-us/library/ms731325.aspx
在调试选项中禁用“Just My Code”。工具 - >选项 - >调试 - >一般“启用我的代码(仅管理)”,看看是否可以捕获内部WCF异常。
// huusom
答案 4 :(得分:1)
我遇到了同样的问题...... WCF,IMO的问题在于将服务返回的base64字符串反序列化到byte []客户端。
如果您不能更改服务配置(例如:使用transferMode =“Streamed”),最容易解决此问题的方法是调整DataContract / ServiceContract客户端。在Response DataContract中将“byte []”替换为“string”。
接下来只需用一段代码解码返回的字符串,例如:
byte [] file = Convert.FromBase64String(pdfBase64String);
要下载70KB的PDF,过去需要~6秒。根据上面提出的建议更改,现在需要< 1秒。
诉P>
PS。:关于传输模式,我确实只尝试改变客户端(transferMode =“StreamedResponse”),但没有改进......
答案 5 :(得分:0)
要检查的第一件事:
修改强>
从你的评论1分钟等待,看来它正在等待超时。你还提到了交易。
我想知道问题是否在其他地方。对WCF服务的调用是正常的,但是调用是在事务内部,并且事务上没有完成或处理(我在这里猜测),然后事务/代码将在等待超时时挂起1分钟。
修改2
接下来要检查的事项:
答案 6 :(得分:0)
可以是客户端试图分析来自服务器端的内容类型吗?尝试在服务器端明确指定服务响应的mime类型,例如Response.ContentType = "application/pdf"
编辑:客户端我指的是任何可能的中介,如防火墙或安全套件。