2011-04-15 69 views
2

我試圖通過WCF通過位圖來傳遞一個位圖,但它拋出「System.ServiceModel.CommunicationException」試圖在通過WCF

System.ServiceModel.CommunicationException 是由用戶代碼未處理
消息=套接字連接被中止 。這可能是由於處理您的消息時出現 錯誤或 遠程主機超出 接收超時或基礎網絡 資源問題所致。本地套接字超時 爲'00:00:59.9650000'。

任何想法可能會造成這種情況?

謝謝!

回答

3

原因是Bitmap類型是一個.NET特定類型(其中也包含很多Win32細節),它不能序列化爲XML。您無法真正將其作爲方法的參數傳回 - 您可能能夠做的是將其流式傳回Stream類型的參數並使用streamed transfer in WCF

或者另一種方式(如果你的位圖不是太大)將轉換成一個字符串,使用Base64編碼,將其作爲字符串發回,然後在客戶端重新編碼。

+0

謝謝! Base64編碼看起來很有希望,明天我會試試看。 – Roger 2011-04-15 20:09:20

+0

奧赫......不,它只適用於非常小的圖像。花了一分鐘來轉換一個0.5MB的圖像。 – Roger 2011-04-15 20:16:57

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語句(有記錄)圍繞你的服務調用的實現,這會告訴你,如果你實施投擲或主機環境投擲。

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> 

作爲打開跟蹤,下面是我的建議,我已經貼在了幾個其他的答案了。

一般來說,一旦你這樣做,你應該大量的詳細信息上發生了什麼事,在服務端,時髦且可以很快診斷問題。