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数据中可能同名的元素。
分享到:
相关推荐
标题中的“WCF服务-分布式事务、自定义对象传递、基础使用示例”揭示了本主题涵盖的关键知识点,包括Windows Communication Foundation (WCF)服务的三个方面:分布式事务处理、自定义对象传递以及基础使用示例。WCF...
**WCF基础示例:传递自定义序列化协定对象** Windows Communication Foundation (WCF)...通过这个示例,开发者可以学习到如何在WCF中创建、配置和使用自定义序列化的协定对象,从而更好地理解和控制服务间的数据交换。
在提供的源码中,我们可以深入理解WCF服务的自定义实现过程。 **WCF基础** 1. **服务契约(Service Contract)**:定义了服务提供的操作或方法。这是通过创建一个接口并在接口上应用`[ServiceContract]`属性来实现...
在本文中,作者探讨了如何利用WCF和MSMQ构建一个高效的消息总线。首先,定义服务合同(Service Contract)是关键,它定义了事件的通知方式。例如,定义了一个泛型接口`IEventNotification<TLog>`,其中`...
本篇文章将深入探讨WCF自定义编码绑定的概念、实现方式以及其在实际应用中的价值。 WCF的编码器是处理消息在传输层和应用层之间转换的关键组件。它们主要分为三类:文本编码器(如SOAP/XML)、二进制编码器和MTOM...
在Windows Communication Foundation (WCF) 中,消息安全模式是一种确保通信双方之间数据安全的方法。本文主要探讨了在消息安全模式下使用UserName客户端身份验证的机制,这种模式要求服务器具有一个有效的X.509证书...
在Windows Communication Foundation (WCF) 中,自定义流是指开发人员根据特定需求创建自己的数据传输机制,以扩展或替换WCF内置的默认流处理方式。这通常涉及到对网络通信过程中的数据编码、解码以及传输优化等环节...
本文将深入探讨如何在WCF中实现自定义会话,以及如何利用`IsInitiating`和`IsTerminating`属性来控制会话的创建和销毁。 首先,理解会话的基本概念非常重要。在WCF中,会话是一种机制,它允许服务端保存关于客户端...
4. 在服务配置文件(web.config或app.config)中添加自定义绑定,使用新创建的编码器。 5. 编译生成DLL,这个DLL可以被其他项目引用,以方便复用。 在实际应用中,我们还需要考虑性能和安全性。虽然数据压缩能提高...
- **队列与事务**:讨论MSMQ队列与事务处理的关系,以及如何在WCF中利用MSMQ实现持久化消息传输。 #### 五、其他知识点 - **ChannelFactory**:介绍如何使用ChannelFactory来创建客户端通道。 - **...
示例代码通常会展示如何在WCF服务中配置和使用MSMQ,包括创建服务端接口、实现离线操作、处理事务等,以便开发者理解如何在实际项目中实现这些功能。 综上所述,WCF结合MSMQ提供了一种强大的离线处理和消息队列通信...
在WCF中使用MSMQ,首先需要在服务合同中定义消息队列的绑定。通常,这会使用Net.MsmqBinding,这是一种专门为MSMQ设计的绑定类型。接着,需要配置服务的行为,指定消息队列的位置和格式,以及队列的访问权限。 **...
本文将深入探讨如何在WCF中创建和处理自定义异常。 首先,要创建一个自定义异常,你需要定义一个新的类,该类继承自`System.Exception`或其派生类。例如,你可以创建一个名为`CustomServiceException`的类: ```...
3. **创建服务契约**:在Host项目中,添加一个新的接口IHelloWCFService,使用`[ServiceContract]`特性标记,定义一个名为`HelloWCF`的OperationContract方法。 4. **实现服务**:创建一个类HelloWCFService,继承...
WCF支持使用消息队列(Message Queuing,简称MSMQ)进行异步通信。`WCF_消息队列_非事务`和`WCF_消息队列_ResponsiveService`展示了如何创建基于消息队列的服务,以及如何设置事务性消息传递。通过这些例子,学习者...
在本文中,我们将深入探讨如何在Windows Communication Foundation(WCF)服务中使用泛型,通过具体的示例来阐述这一技术的应用。WCF是.NET框架中的一个关键组件,用于构建分布式应用程序,而泛型则是一种强大的编程...
本篇文章将详细探讨如何在WCF中使用事务,并通过提供的"Transactional Behavior"示例来深入理解其工作原理。 事务是一种管理数据库更改的机制,它确保一组操作要么全部成功,要么全部失败,避免数据不一致。在WCF中...
**MSMQ消息队列详解** MSMQ,全称为Microsoft Message Queuing,是微软提供的一种异步通信技术。...在实践中,还需要关注MSMQ与其它技术(如WCF、Windows服务等)的集成,以构建更完善的系统架构。
### 无法启动MSMQ服务的知识点详解 #### 一、MSMQ简介 消息队列服务(Message Queuing Service,简称MSMQ)是Microsoft提供的一种消息传递技术,它允许应用程序跨网络进行可靠的消息发送与接收。MSMQ支持异步通信...
为了演示如何在WCF服务中使用泛型,首先需要创建一个包含数据模型的数据模型项目。在这个例子中,我们创建了一个名为`Zaxx.Abc.WCFModel`的项目,并且在这个项目中定义了几个数据模型类。 - **Person** 类作为所有...