我正在尝试通过WCF传递一个Bitmap,但它会抛出
System.ServiceModel.CommunicationException 用户代码未处理 消息=套接字连接是 中止。这可能是由一个人引起的 处理您的消息时出错或 接收超时被超过 远程主机或底层网络 资源问题。本地套接字超时 是'00:00:59.9650000'。
知道可能导致这种情况的原因吗?
谢谢!
答案 0 :(得分:3)
原因是Bitmap
类型是.NET特定类型(其中也包含许多Win32特性),它不能序列化为XML。您无法将其作为方法的参数传回 - 您可以做的是将其传回Stream
类型的参数并使用streamed transfer in WCF。
或者另一种方式(如果您的位图不是太大)将使用Base64编码将Bitmap
转换为字符串,将其作为字符串发送回来,然后在客户端上重新编码侧。
答案 1 :(得分:2)
假设您在IIS中托管WCF服务(您没有提及任何细节)。
尝试在客户端和服务器配置文件中添加一些数字(请记住设置必须匹配)。
<binding name="Binding_ISomeervice" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:10:00"
transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
hostNameComparisonMode="StrongWildcard" listenBacklog="1000"
maxBufferPoolSize="524288" maxBufferSize="2147483647" maxConnections="100"
maxReceivedMessageSize="2147483647">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="2147483647"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
</binding>
还在服务器的Web配置文件中启用调试:
<system.web>
<compilation debug="true" />
</system.web>
如果可以,请将try / catch(带日志记录)放在服务调用实现周围,这将告诉您实现是在抛出还是托管环境正在抛出。
答案 2 :(得分:1)
答案 3 :(得分:0)
我的回答分为两部分:针对这种情况的建议,以及有关更好的错误报告和未来追踪的建议。
由于您正在处理位图,您是否考虑过使用WCF的原始编程模型? This blog post details如何在服务端使用编程模型,this follow-up blog post详细说明了如何在客户端使用它。我已经看到它在文件上传和图像传输方案中使用了很多,所以它也可以帮助你的情况!
CommunicationException是通用的,不会泄露底层异常。在将来,当报告错误时,我建议在服务器上启用IncludeExceptionDetailInFaults(来自ServiceBehaviorAttribute或来自配置行为),以便将异常信息发送回客户端,然后报告您详细了解的嵌套异常
例如:
<behaviors>
<serviceBehaviors>
<behavior
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
至于开启追踪,下面是我的建议,我已经在其他一些答案中粘贴了。
在服务端启用跟踪,生成跟踪日志,并使用SvcTraceViewer进行分析。为此,请按照this MSDN article on using the service trace viewer。
使用Fiddler监控客户端和服务端的有线流量。
通常,一旦你这样做,你应该有更多关于服务方面什么是时髦的信息,并且可以很快地诊断问题。