WCF中使用MSMQ无法传送自定义对象
WCF在底层使用操作系统的MSMQ实现离线的队列操作,并为此提供了一个NetMsmqBinding。
通过精心的设计,在WCF中使用NetMsmqBinding与使用其他绑定的编程方式是一致的。
然而,这里面有一个容易忽视的地方。那就是要注意在服务协定中要使用自定义对象的问题。
一个例子如下所示:
[ServiceContract]
public interface IWCFMSMQTransactionService
{
[OperationContract(IsOneWay=true)]
void SendMessage(MyDataItem data);
}
上述服务协定要使用自定义类型MyDataItem ,它的声明如下 :
[DataContract]
public class MyDataItem
{
[DataMember]
public int IntValue
{
get;
set;
}
[DataMember]
public string StringValue
{
get;
set;
}
}
你会发现,如果使用NetMsmqBinding绑定时,客户端将无法将一个MyDataItem对象序列化并传送到服务端。并且,整个程序不会引发任何异常,只是服务端反序列化出来的MyDataItem对象的属性全部具有默认值。
解决方法很简单:
给MyDataItem加上一个命名空间:
[DataContract(Namespace="http://www.bit.edu.cn/CS")]
public class MyDataItem
{
[DataMember]
public int IntValue
{
get;
set;
}
//代码略
}
则一切工作正常。
原因何在?
其实,这是因为MSMQ的问题。默认设置下,MSMQ使用XmlMessageFormatter序列化对象,对象被转换为XML数据。在这个序列化过程中,如果WCF中的数据对象没有设置命名空间,则MSMQ不会序列化这个对象中各个属性的值,这是可以理解的,XML规范要求必须通过命名空间区分开不同来源的XML数据中可能同名的元素。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/bitfan/archive/2009/07/01/4312148.aspx
分享到:
相关推荐
对资源 WCF分布式事务配置(文档+Demo) http://download.csdn.net/source/1426673 的一点补充,和修改,同步更新了文档。。
WCF基础示例(传递自定义序列化协定对象)
WCF自定义示例源码,源代码是在VS2010版本写的,生成成功后,先运行Hosting,再执行Client程序。
WCF 自定义编码绑定
WCF 学习笔记 WCF 杂项 WCF Security WCF Transaction WCF MSMQ __
WCF服务的操作方法中实现T GetEntity(int id) where T: EntityBase
建议安全上下文以后,使用共享安全上下文对SOAP消息进行加密和签名。但是采用UserName客户端身份验证。也就是客户端提供用户名和密码才可以访问此服务。 1.身份验证(服务器):提供证书,(使用 HTTP)用于初始会话...
WCF传输使用实例WCF传输使用实例WCF传输使用实例
自定义wcf流
WCF中使用Transaction的例子,通过这个例子学会事务的使用,如果大家需要,我可以再发相关例子
演示了wcf中怎样用IsInitiating,IsTerminating创建会话和销毁会话。
WCF自定义异常
几年以前,在一个系统中,我采用.Net Remoting / MSMQ / HTTP 构建了发布/订阅消息总线(Pub/Sub Message Bus),但是觉得不是很完美。很多地方实现比较困难,并且需要定制的代码,如承载队列监听(host the queue ...
展示了WCF的简单的示例 包括自定义类的访问
2.自定义托管宿主WCF解决方案开发配置过程详解 3.WCF服务元数据交换、配置及编程开发 4.WCF服务可靠性传输配置与编程开发 5.服务契约与操作重载 6.WCF服务契约继承与分解设计 7.WCF数据契约与序列化 8.使用数据...
文档清楚明了的讲述如何在WCF的操作方法中达到泛型效果。
WCF中MessageContract的实现,分为Host,Service和Client
一个WCF下的数据压缩实例,编译生成的DLL可直接引用。
使用wcf的wpf程序 使用wcf的wpf程序 使用wcf的wpf程序
C#MSMQ 消息队列工具,MSMQ(消息队列) 前段时间研究WCF接触到了MSMQ,弄了一个小工具 分享一下