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

 

posted @ 2015-03-31 12:43  技术_菜鸟  阅读(3420)  评论(0编辑  收藏  举报