wcf返回值報錯解析


問題來源

最近在項目中使用wcf,因為是一個新手,對新的東西總是比較敬畏,不過一切都是進行得很順利,運行的時候,突然報了錯,編譯器提示的錯誤大概是:“InvalidOperationException:無法加載操作“UploadResourceNotInDb”,它具有類型為 System.ServiceModel.Channels.Message 的參數或返回類型,或具有一個帶有 MessageContractAttribute 及其他不同類型參數的類型。”

服務契約(Service Contract)和消息契約(Message Contract)如下:

 1  [ServiceContract(Name = "ResourceFile")]
 2     public interface ISysResourceSyncService : IBaseService
 3     { /// <summary>
 4         /// 同步到服務器端,不會記錄到數據庫,僅僅是同步文件到服務器端
 5         /// </summary>
 6         /// <param name="ResourceFile"></param>
 7 
 8         [OperationContract]
 9         void UploadResourceNotInDb(ResourceFile ResourceFile);
10      }
11 
12     [MessageContract]
13     public class ResourceFile
14     {
15         [MessageBodyMember]
16         public Stream ResourceBody { get; set; }
17 
18         [MessageHeader]
19         public string ResourceName { get; set; }
20 
21         [MessageHeader]
22         public string ResourcePath { get; set; }
23 
24         [MessageHeader]
25         public string ReflectEntity { get; set; }
26 
27         [MessageHeader]
28         public string FieldName { get; set; }
29 
30         [MessageHeader]
31         public int EntityId { get; set; }
32     }

 

問題查找

給經過查找不同的資料,發現在http://msdn.microsoft.com/zh-cn/library/ms730255.aspx,找到了問題解決辦法。

英文解析:

A messaging-style operation has at most one parameter and one return
value where both types are message types; that is, they serialize
directly into a specified SOAP message structure. This may be any type
marked with the MessageContractAttribute or the Message type.

中文解析:

即:如果一個服務契約(Service Contract)的某個服務操作(operation)是基於消息類型(messaging-style)的,則這個服務操作(operation)必須:

最多有一個輸入參數

最多有一個返回類型

輸入參數和返回類型必須是消息類型(message type,如消息契約或者Message類型的參數)的。當然可以不返回,為void。

意思都很明白了,那就着手修改一下!

解決辦法

把返回bool改回void或者消息類型,即可!完美運行

擴展知識

另外,在定義應用於流(stream)傳輸的消息契約(Message Contract)時:

一、SOAP主體(即,[MessageBodyMember]應用的屬性)只能有一個,即 public System.IO.Stream FileData { get; set; }

二、SOAP報頭(即,[MessageHeader]應用的屬性)可以有多個,傳輸文件名,大小,時間等。

為了提高性能,可以將多個報頭合成一個報頭,那就必須利用數據契約(Data Contract)來合成多個數據。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM