我試圖通過WCF通過位圖來傳遞一個位圖,但它拋出「System.ServiceModel.CommunicationException」試圖在通過WCF
System.ServiceModel.CommunicationException 是由用戶代碼未處理
消息=套接字連接被中止 。這可能是由於處理您的消息時出現 錯誤或 遠程主機超出 接收超時或基礎網絡 資源問題所致。本地套接字超時 爲'00:00:59.9650000'。
任何想法可能會造成這種情況?
謝謝!
我試圖通過WCF通過位圖來傳遞一個位圖,但它拋出「System.ServiceModel.CommunicationException」試圖在通過WCF
System.ServiceModel.CommunicationException 是由用戶代碼未處理
消息=套接字連接被中止 。這可能是由於處理您的消息時出現 錯誤或 遠程主機超出 接收超時或基礎網絡 資源問題所致。本地套接字超時 爲'00:00:59.9650000'。
任何想法可能會造成這種情況?
謝謝!
原因是Bitmap
類型是一個.NET特定類型(其中也包含很多Win32細節),它不能序列化爲XML。您無法真正將其作爲方法的參數傳回 - 您可能能夠做的是將其流式傳回Stream
類型的參數並使用streamed transfer in WCF。
或者另一種方式(如果你的位圖不是太大)將轉換成一個字符串,使用Base64編碼,將其作爲字符串發回,然後在客戶端重新編碼。
嘿,這是來自WCF的更令人惱火的信息之一。我的猜測是郵件大小太大。我發現找出這些東西的最可靠的方法是使用WCF跟蹤,如http://msdn.microsoft.com/en-us/library/ms733025.aspx和SvcTraceViewer.exe所述。
假設你在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語句(有記錄)圍繞你的服務調用的實現,這會告訴你,如果你實施投擲或主機環境投擲。
我的答案有兩個部分:針對這種情況的建議,以及關於更好的錯誤報告和未來跟蹤的建議。
由於您正在處理位圖,您是否考慮過使用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監控客戶端和服務端的有線流量。
一般來說,一旦你這樣做,你應該大量的詳細信息上發生了什麼事,在服務端,時髦且可以很快診斷問題。
謝謝! Base64編碼看起來很有希望,明天我會試試看。 – Roger 2011-04-15 20:09:20
奧赫......不,它只適用於非常小的圖像。花了一分鐘來轉換一個0.5MB的圖像。 – Roger 2011-04-15 20:16:57