bitfan(数字世界一凡人)的专栏

我的新浪博客:http://blog.sina.com.cn/bitfan(发表非技术性文章)

原创  WCF中使用MSMQ无法传送自定义对象 收藏

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数据中可能同名的元素。

发表于 @ 2009年07月01日 10:37:00 | 评论( loading... ) | 编辑| 举报| 收藏

旧一篇:你该如何填报高考志愿? | 新一篇:VS2010无法运行与调试Silverlight 3应用程序

  • 发表评论
  • 评论内容:
  •  
Copyright © bitfan
Powered by CSDN Blog