zoukankan      html  css  js  c++  java
  • 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)来合成多个数据。

  • 相关阅读:
    《构建之法》1.2.3章读后感
    0302思考并回答一些问题
    1231 实验四 递归下降语法分析程序设计
    1211 有穷自动机的构造与识别
    1112-评论
    C语言文法定义及C程序的推导过程
    词法分析
    0909对编译原理的理解
    团队合作2.0
    "数学口袋精灵"bug的发现及单元测试
  • 原文地址:https://www.cnblogs.com/hai-ping/p/4380537.html
Copyright © 2011-2022 走看看