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

  • 相关阅读:
    java jdbc笔记整理
    Spring IOC (构造器注入)
    WEB-INF目录与META-INF目录的作用[转]
    [转]LL(1)文法判别之First集合、Follow集合、Select集合求法
    java读取TXT文件的方法 (转)
    Ubuntu 12.04下搭建Web服务器 (MySQL+PHP+Apache)(转)
    题目:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)
    error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCR...(转)
    汇编leal命令的灵活用法及理解
    C++之继承
  • 原文地址:https://www.cnblogs.com/hai-ping/p/4380537.html
Copyright © 2011-2022 走看看