C# 的 WCF文章 消息契约(Message Contract)在流(Stream )传输大文件中的应用
2013-06-19 21:46
411 查看
我也遇到同样问题,所以抄下做MARK
http://www.cnblogs.com/lmjq/archive/2011/07/19/2110319.html
刚做完一个binding为netTcpBinding,transferMode为"Streamed"传输大文件的例子。
现实验用消息契约(Message Contract)来传输文件名等信息。
服务契约(Service Contract)和消息契约(Message Contract)如下:
运行程序错误,异常提示信息如下:
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)来合成多个数据。
在上面的例子中将方法:
改为:
或者将返回类型设为某个定义的消息契约(Message Contract)。
问题解决。
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)。
问题解决。
相关文章推荐
- 消息契约(Message Contract)在流(Stream )传输大文件中的应用
- C#利用WCF改进文件流传输的三种方式
- C#开发微信门户及应用(19)-微信企业号的消息发送(文本、图片、文件、语音、视频、图文消息等)
- C#利用WCF改进文件流传输的三种方式
- C#大文件传输之SOCKET同步、异步、WCF同步、异步
- 化零为整WCF(8) - 消息处理(使用流数据传输文件)
- 化零为整WCF(8) - 消息处理(使用流数据传输文件)
- C#开发微信门户及应用(19)-微信企业号的消息发送(文本、图片、文件、语音、视频、图文消息等)
- 化零为整WCF(8) - 消息处理(使用流数据传输文件)
- C# tcp发送消息和传输文件
- C# tcp发送消息和传输文件
- C# tcp发送消息和传输文件
- c#FileStream文件读写
- WCF技术剖析之十八:消息契约(Message Contract)和基于消息契约的序列化1
- c#传输文件
- C#开发微信门户及应用(27)-公众号模板消息管理
- 在C#代码中应用Log4Net(三)Log4Net中配置文件的解释
- C#开发微信门户及应用(27)-公众号模板消息管理
- WCF 之 消息契约(MessageContract)
- 2008年11月份最佳C#技术文章集,关于WPF LINQ pre-JIT WCF等最新技术实例