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)来合成多个数据。

 

你可能感兴趣的:(WCF)