问题来源
最近在项目中使用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)来合成多个数据。