問題來源
最近在項目中使用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)來合成多個數據。