`
izuoyan
  • 浏览: 9219764 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

分享到:
评论

相关推荐

    6月22日PM WCF服务-分布式事务、自定义对象传递、基础使用示例.rar

    标题中的“WCF服务-分布式事务、自定义对象传递、基础使用示例”揭示了本主题涵盖的关键知识点,包括Windows Communication Foundation (WCF)服务的三个方面:分布式事务处理、自定义对象传递以及基础使用示例。WCF...

    WCF基础示例(传递自定义序列化协定对象)

    **WCF基础示例:传递自定义序列化协定对象** Windows Communication Foundation (WCF)...通过这个示例,开发者可以学习到如何在WCF中创建、配置和使用自定义序列化的协定对象,从而更好地理解和控制服务间的数据交换。

    WCF自定义服务示例源码

    在提供的源码中,我们可以深入理解WCF服务的自定义实现过程。 **WCF基础** 1. **服务契约(Service Contract)**:定义了服务提供的操作或方法。这是通过创建一个接口并在接口上应用`[ServiceContract]`属性来实现...

    基于WCF和MSMQ构建发布订阅消息总线

    在本文中,作者探讨了如何利用WCF和MSMQ构建一个高效的消息总线。首先,定义服务合同(Service Contract)是关键,它定义了事件的通知方式。例如,定义了一个泛型接口`IEventNotification<TLog>`,其中`...

    WCF 自定义编码绑定

    本篇文章将深入探讨WCF自定义编码绑定的概念、实现方式以及其在实际应用中的价值。 WCF的编码器是处理消息在传输层和应用层之间转换的关键组件。它们主要分为三类:文本编码器(如SOAP/XML)、二进制编码器和MTOM...

    WCF消息安全模式之自定义用户名密码

    在Windows Communication Foundation (WCF) 中,消息安全模式是一种确保通信双方之间数据安全的方法。本文主要探讨了在消息安全模式下使用UserName客户端身份验证的机制,这种模式要求服务器具有一个有效的X.509证书...

    自定义wcf流

    在Windows Communication Foundation (WCF) 中,自定义流是指开发人员根据特定需求创建自己的数据传输机制,以扩展或替换WCF内置的默认流处理方式。这通常涉及到对网络通信过程中的数据编码、解码以及传输优化等环节...

    wcf自定义会话

    本文将深入探讨如何在WCF中实现自定义会话,以及如何利用`IsInitiating`和`IsTerminating`属性来控制会话的创建和销毁。 首先,理解会话的基本概念非常重要。在WCF中,会话是一种机制,它允许服务端保存关于客户端...

    WCF数据压缩传送

    4. 在服务配置文件(web.config或app.config)中添加自定义绑定,使用新创建的编码器。 5. 编译生成DLL,这个DLL可以被其他项目引用,以方便复用。 在实际应用中,我们还需要考虑性能和安全性。虽然数据压缩能提高...

    WCF 学习笔记(包括WCF基本知识、Security、MSMQ、Transaction等等)

    - **队列与事务**:讨论MSMQ队列与事务处理的关系,以及如何在WCF中利用MSMQ实现持久化消息传输。 #### 五、其他知识点 - **ChannelFactory**:介绍如何使用ChannelFactory来创建客户端通道。 - **...

    WCF分布式开发步步为赢(13)WCF服务离线操作与消息队列MSMQ[参照].pdf

    示例代码通常会展示如何在WCF服务中配置和使用MSMQ,包括创建服务端接口、实现离线操作、处理事务等,以便开发者理解如何在实际项目中实现这些功能。 综上所述,WCF结合MSMQ提供了一种强大的离线处理和消息队列通信...

    wcf消息队列

    在WCF中使用MSMQ,首先需要在服务合同中定义消息队列的绑定。通常,这会使用Net.MsmqBinding,这是一种专门为MSMQ设计的绑定类型。接着,需要配置服务的行为,指定消息队列的位置和格式,以及队列的访问权限。 **...

    WCF自定义异常

    本文将深入探讨如何在WCF中创建和处理自定义异常。 首先,要创建一个自定义异常,你需要定义一个新的类,该类继承自`System.Exception`或其派生类。例如,你可以创建一个名为`CustomServiceException`的类: ```...

    WCF传输使用实例 WCF传输使用实例

    3. **创建服务契约**:在Host项目中,添加一个新的接口IHelloWCFService,使用`[ServiceContract]`特性标记,定义一个名为`HelloWCF`的OperationContract方法。 4. **实现服务**:创建一个类HelloWCFService,继承...

    WCF系列学习源码

    WCF支持使用消息队列(Message Queuing,简称MSMQ)进行异步通信。`WCF_消息队列_非事务`和`WCF_消息队列_ResponsiveService`展示了如何创建基于消息队列的服务,以及如何设置事务性消息传递。通过这些例子,学习者...

    WCF中使用泛型效果示例

    在本文中,我们将深入探讨如何在Windows Communication Foundation(WCF)服务中使用泛型,通过具体的示例来阐述这一技术的应用。WCF是.NET框架中的一个关键组件,用于构建分布式应用程序,而泛型则是一种强大的编程...

    WCF中使用Transaction的例子,通过这个例子学会事务的使用

    本篇文章将详细探讨如何在WCF中使用事务,并通过提供的"Transactional Behavior"示例来深入理解其工作原理。 事务是一种管理数据库更改的机制,它确保一组操作要么全部成功,要么全部失败,避免数据不一致。在WCF中...

    msmq消息队列相关

    **MSMQ消息队列详解** MSMQ,全称为Microsoft Message Queuing,是微软提供的一种异步通信技术。...在实践中,还需要关注MSMQ与其它技术(如WCF、Windows服务等)的集成,以构建更完善的系统架构。

    无法启动MSMQ服务

    ### 无法启动MSMQ服务的知识点详解 #### 一、MSMQ简介 消息队列服务(Message Queuing Service,简称MSMQ)是Microsoft提供的一种消息传递技术,它允许应用程序跨网络进行可靠的消息发送与接收。MSMQ支持异步通信...

    WCF中应用泛型

    为了演示如何在WCF服务中使用泛型,首先需要创建一个包含数据模型的数据模型项目。在这个例子中,我们创建了一个名为`Zaxx.Abc.WCFModel`的项目,并且在这个项目中定义了几个数据模型类。 - **Person** 类作为所有...

Global site tag (gtag.js) - Google Analytics