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

时间: 2024-08-28 10:23:20

wcf返回值报错解析的相关文章

falsk 请求没有返回值报错

线上报警 5xx 错误,查看日志发现报这个错, TypeError: The view function did not return a valid response. The function either returned None or ended without a return statement. 这个方法没有有效的返回结果 页面报这个错误 Internal Server Error The server encountered an internal error and was

VC++ 通过ADO连接数据库查询时返回空值报错的解决方案

当数据库的字段值允许为空时, 而且此时内容也为空时,则执行查询会出错,例如 CString str = pRecordset->GetFields()->GetItem((long)0)->GetValue(); 或者 str= pRecordset->GetCollect("posInfo"); 会弹出如下窗口提示出错! 更加奇怪的是  catch(...)也抓不到异常 今天碰着个问题算是头弄大了  最后终于弄好了 报错的原因:   在GetCollct返回了

linux编程中接收主函数返回值以及错误码提示

程序A创建子进程,并调用进程B,根据不调用的不同情况,最后显示结果不同. #include <stdio.h> #include <unistd.h> #include <sys/wait.h> #include <sys/types.h> #include <errno.h> int main() { pid_t pid, rpid; int stat; if ((pid = fork()) < 0) { perror("for

redis取值报错

> get "all_couriers_on_the_job" (error) ERR Operation against a key holding the wrong kind of value #类型不对,所以报错,先查看值的类型: > type "all_couriers_on_the_job" hash > HGETALL "all_couriers_on_the_job" 1) "47" 2) &

MySQL数据库储存bit类型的值报错

当我们储存bit类型的值时,不能直接写入数字 上图中的画圈部分就是bit类型,若是直接填入"1"或"0"等等就会报错,如下: 这时候,我们要看bit(M)的M值是多少,若M=4,则写成b'0001';若M=6,则写成b'000001'即可

PreparedStatement传进null值报错

最近在测试jdbc数据导入大量数据的性能,发现PreparedStatement传进null值会报错. 解决方法: setObject(int parameterIndex, Object x, int targetSqlType) 如:preparedStatement.setObject(10,org.springframework.util.StringUtils.isEmpty(row[9]) ? null : Integer.parseInt(row[9]),java.sql.Type

安装PIL报错解析

开始安装PIL PIL只支持到python2.7,我安装的是python3.6版本,所以  不支持,报错 需要下载支持自己版本的包,下载地址https://www.lfd.uci.edu/~gohlke/pythonlibs/#pillow 选择支持自己电脑系统版本64和python3.6版本的pillow, 下载完成后,将下载的文件拖动到D盘 打开cmd ,进入D盘  pip install Pillow-6.0.0-cp36-cp36m-win_amd64.whl 下载完成后,校验是否成功

C++ delete报错解析

C++ delete报错 今天写了如下代码 #include <iostream> #include <algorithm> using namespace std; int main() { int n, s, a, b; int ans = 0; cin >> n >> s; cin >> a >> b; int* p = new int[n]; int temp; int length = 0; for (int i = 0;

网站各种报错解析not found,404,forbiden,403

2. 打不开页面 只要页面上有返回错误代码,解析都已经生效,需要做的就是检查服务器配置. 以下是常见的错误代码页面: 凡是出现以上页面,都与解析无关,请检查服务器配置.