尝试通过WCF传递位图时出现“System.ServiceModel.CommunicationException”

时间:2011-04-15 19:19:43

标签: c# wcf bitmap

我正在尝试通过WCF传递一个Bitmap,但它会抛出

  

System.ServiceModel.CommunicationException   用户代码未处理   消息=套接字连接是   中止。这可能是由一个人引起的   处理您的消息时出错或   接收超时被超过   远程主机或底层网络   资源问题。本地套接字超时   是'00:00:59.9650000'。

知道可能导致这种情况的原因吗?

谢谢!

4 个答案:

答案 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)

嘿,这是来自WCF的更令人恼火的消息之一。我的猜测是邮件大小太大了。我发现最可靠的方法是使用http://msdn.microsoft.com/en-us/library/ms733025.aspx和SvcTraceViewer.exe中描述的WCF跟踪。

答案 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> 

至于开启追踪,下面是我的建议,我已经在其他一些答案中粘贴了。

通常,一旦你这样做,你应该有更多关于服务方面什么是时髦的信息,并且可以很快地诊断问题。