C# 的 WCF文章 消息契约(Message Contract)在流(Stream )传输大文件中的应用
我也遇到同样问题,所以抄下做MARK
http://www.cnblogs.com/lmjq/archive/2011/07/19/2110319.html
刚做完一个binding为netTcpBinding,transferMode为"Streamed"传输大文件的例子。
现实验用消息契约(Message Contract)来传输文件名等信息。
服务契约(Service Contract)和消息契约(Message Contract)如下:

[ServiceContract(Namespace ="http://Microsoft.Samples.Stream",ConfigurationName="StreamingConfigurationName")]
publicinterface IStreamingSample
{
[OperationContract]
bool UploadStream(FileUploadData request);
} [MessageContract]
publicclass FileUploadData
{
[MessageHeader]
public String FileName { get; set; }
[MessageBodyMember]
public System.IO.Stream FileData { get; set; }
}

运行程序错误,异常提示信息如下:
InvalidOperationException:无 法加载操作“UploadStream”,因为它具有类型为 System.ServiceModel.Channels.Message 的参数或返回类型,或具有一个带有 MessageContractAttribute 及其他不同类型参数的类型。当使用 System.ServiceModel.Channels.Message 或具有 MessageContractAttribute 的类型时,方法不应使用任何其他参数类型。
后查看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。
另外,在定义应用于流(stream)传输的消息契约(Message Contract)时:
- SOAP主体(即,[MessageBodyMember]应用的属性)只能有一个,即 public System.IO.Stream FileData { get; set; }
- SOAP报头(即,[MessageHeader]应用的属性)可以有多个,传输文件名,大小,时间等。
- 为了提高性能,可以将多个报头合成一个报头,那就必须利用数据契约(Data Contract)来合成多个数据。
在上面的例子中将方法:
[OperationContract]
bool UploadStream(FileUploadData request);
改为:
[OperationContract]
void UploadStream(FileUploadData request);
或者将返回类型设为某个定义的消息契约(Message Contract)。
问题解决。
C# 的 WCF文章 消息契约(Message Contract)在流(Stream )传输大文件中的应用的更多相关文章
- WCF 用netTcpbinding,basicHttpBinding 传输大文件
问题:WCF如何传输大文件 方案:主要有几种绑定方式netTcpbinding,basicHttpBinding,wsHttpbinding,设置相关的传输max消息选项,服务端和客户端都要设置,tr ...
- WCF 之 消息契约(MessageContract)
对于SOAP来说主要由两部分构成Header和Body,他们两个共同构成了SOAP的信封,通常来说Body保存具体的数据内容,Header保存一些上下文信息或关键信息. 比如:在一些情况下,具有这样的 ...
- 重温WCF之消息契约(MessageContract)(六)
对于SOAP来说主要由两部分构成Header和Body,他们两个共同构成了SOAP的信封,通常来说Body保存具体的数据内容,Header保存一些上下文信息或关键信息.比如:在一些情况下,具有这样的要 ...
- WCF把书读薄(3)——数据契约、消息契约与错误契约
上一篇:WCF把书读薄(2)——消息交换.服务实例.会话与并发 十二.数据契约 在实际应用当中数据不可能仅仅是以int Add(int num1, int num2)这种简单的几个int的方式进行传输 ...
- wcf消息契约
1.最多一个参数和一个返回值,返回值和参数的类型都是消息类型. 下面的代码为定义一个消息契约的实例 [MessageContract] public class MyMessage { ...
- WCF利用Stream上传大文件
WCF利用Stream上传大文件 转自别人的文章,学习这个例子,基本上wcf也算入门了,接口用法.系统配置都有了 本文展示了在asp.net中利用wcf的stream方式传输大文件,解决了大文件上传问 ...
- WCF传输大数据的设置
在从客户端向WCF服务端传送较大数据(>65535B)的时候,发现程序直接从Reference的BeginInvoke跳到EndInvoke,没有进入服务端的Service实际逻辑中,怀疑是由于 ...
- 【转】WCF传输大数据的设置
在从客户端向WCF服务端传送较大数据(>65535B)的时候,发现程序直接从Reference的BeginInvoke跳到EndInvoke,没有进入服务端的Service实际逻辑中,怀疑是由于 ...
- WCF技术剖析之十八:消息契约(Message Contract)和基于消息契约的序列化
原文:WCF技术剖析之十八:消息契约(Message Contract)和基于消息契约的序列化 [爱心链接:拯救一个25岁身患急性白血病的女孩[内有苏州电视台经济频道<天天山海经>为此录制 ...
随机推荐
- commons-io源码阅读心得
FileCleanTracker: 开启一个守护线程在后台默默的删除文件. /* * Licensed to the Apache Software Foundation (ASF) under on ...
- Python之路【第二十三篇】:Django 初探--Django的开发服务器及创建数据库(笔记)
Django 初探--Django的开发服务器及创建数据库(笔记) 1.Django的开发服务器 Django框架中包含一些轻量级的web应用服务器,开发web项目时不需再对其配置服务器,Django ...
- 第十一篇:web之Django之Form组件
Django之Form组件 Django之Form组件 本节内容 基本使用 form中字段和插件 自定义验证规则 动态加载数据到form中 1. 基本使用 django中的Form组件有以下几个功 ...
- Magento 中的多个类别的筛选产品集合
通过在 Magento 中的多个类别的筛选产品集合. 按只 1 类别筛选 Magento 提供筛选器,可以使用直接从该集合的类型: $_category = Mage::getModel('catal ...
- 在Linux下开始C语言的学习
为什么要在linux下学习C语言? linux下可以体验到最纯粹的C语言编程,可以抛出其他IDE的影响 环境配置简单,一条命令就足够.甚至对于大多数linux发行版本,都已经不需要配置C语言的环境 查 ...
- 初见Javascript
1.HTML 中的脚本必须位于 <script> 与 </script> 标签之间. 脚本可被放置在 HTML 页面的 <body> 和 <head> ...
- 【转】浅谈Java中的hashcode方法(这个demo可以多看看)
浅谈Java中的hashcode方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native i ...
- c#调用c++ dll(一)
首先来说说c++中的dll 核心的一些知识 比较大的应用程序都由很多模块组成,这些模块分别完成相对独立的功能,它们彼此协作来完成整个软件系统的工作.可能存在一些模块的功能较为通用,在构造其它软件系统时 ...
- [jquery] jQuery点滴[持续更新]
001.查看jquery的版本. $(function(){ console.log($()); //jquery console.log($().jquery); }); 002.(new Func ...
- MFC类的结构
1. CObject类,MFC库中绝大部分类的基类,封装了MFC中的最基本机制. 运行时类信息机制/动态创建机制/序列化机制等... 2. CCmdtarget - 消息映射机制最基类 3. CWin ...