一、消息版本

为了区别消息的结构和寻址机制,W3C定制了SOAP1.1和SOAP1.2定义消息的结构,WS-Addressing 2004和WS-Addressing 1.0定义消息的寻址机制。

它们对应的命名空间如下:

SOAP1.1:http://schemas.xmlsoap.org/soap/envelope/

SOAP1.2:http://www.w3.org/2003/05/soap-envelope

WS-Addressing 2004:http://schemas.xmlsoap.org/ws/2004/08/addressing

WS-Addressing 1.0:http://www.w3.org/2005/08/addressing

Soap12WSAddressingAugust2004版本的消息:

<s:Envelope xmlns:a="http://schemas.xmlsoap.org/ws/2004/08/addressing"
xmlns:s="http://www.w3.org/2003/05/soap-envelope">
<s:Header>
<a:Action s:mustUnderstand="1">http://www.cnblogs.com/</a:Action>
</s:Header>
<s:Body>
<Order xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/ConsoleApplication4">
<Name>Order</Name>
<Price>85</Price>
</Order>
</s:Body>
</s:Envelope>

Soap11WSAddressing10版本消息:

<s:Envelope xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<a:Action s:mustUnderstand="1">http://www.cnblogs.com/</a:Action>
</s:Header>
<s:Body>
<Order xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/ConsoleApplication4">
<Name>Order</Name>
<Price>85</Price>
</Order>
</s:Body>
</s:Envelope>

详情看MessageVersion类,可以通过CreateVersion(EnvelopeVersion envelopeVersion, AddressingVersion addressingVersion)创建对于的消息版本,以及已经定义好的Soap11WSAddressing10、Soap11WSAddressingAugust2004、Soap11、Soap12等消息版本。

二、创建消息

      先定义如下一个将消息写入指定文本的方法。writer.Formatting = Formatting.Indented;的作用是使文本Message缩进显示。

 public static void WriteMessage(Message msg, string path)
{
using (XmlTextWriter writer = new XmlTextWriter(path,Encoding.UTF8))
{
writer.Formatting = Formatting.Indented;
msg.WriteMessage(writer);
}
}

      (1)创建空白消息

Message的静态方法:public static Message CreateMessage(MessageVersion version, string action);

 static void Main(string[] args)
{
Message msg = Message.CreateMessage(MessageVersion.Soap12WSAddressingAugust2004, "http://www.cnblogs.com/");
WriteMessage(msg, @"D:\1.txt");
}

空消息为:

<s:Envelope xmlns:a="http://schemas.xmlsoap.org/ws/2004/08/addressing"
xmlns:s="http://www.w3.org/2003/05/soap-envelope">
<s:Header>
<a:Action s:mustUnderstand="1">http://www.cnblogs.com/</a:Action>
</s:Header>
<s:Body />
</s:Envelope>

(2)消息内容为可序列化的对象

    class Program
{
static void Main(string[] args)
{
Order order = new Order() { Name = "Order", Price = 88 };
Message msg = Message.CreateMessage(MessageVersion.Soap12, "http://www.cnblogs.com/", order);
WriteMessage(msg, @"D:\1.txt");
}
}
[DataContract]
public class Order
{
[DataMember]
public string Name; [DataMember]
public int Price;
}

1.txt中的消息为:

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope">
<s:Header>
<Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://www.cnblogs.com/</Action>
</s:Header>
<s:Body>
<Order xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/ConsoleApplication4">
<Name>Order</Name>
<Price>85</Price>
</Order>
</s:Body>
</s:Envelope>

(3)通过XmlReader将文件中的内容读取到消息中

 static void Main(string[] args)
{
Message msg = Message.CreateMessage(MessageVersion.Soap12, "http://www.cnblogs.com/", new XmlTextReader(@"D:\1.txt"));
WriteMessage(msg, @"D:\2.txt");
}

(4)通过XmlElement构造消息Body

static void Main(string[] args)
{
XNamespace ns = "msdn.microsoft.com";
XElement Body = new XElement(new XElement(ns + "Order",
new XElement(ns + "Name", "JDTmall"),
new XElement(ns + "Price", "85")
));
Message msg = Message.CreateMessage(MessageVersion.Soap12, "http://www.cnblogs.com/", Body);
WriteMessage(msg, @"D:\1.txt");
}

1.txt中的消息为:

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope">
<s:Header>
<Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://www.cnblogs.com/</Action>
</s:Header>
<s:Body>
<Order xmlns="msdn.microsoft.com">
<Name>JDTmall</Name>
<Price>85</Price>
</Order>
</s:Body>
</s:Envelope>

三、消息的状态

指定消息的状态,消息只能被操作一次,从Created到Read、Written、Copied、Closed。操作过一次的消息后无法还原,即不可能再转变成Created状态。

public enum MessageState
{
//消息已创建。
Created = 0,
//消息正在被读取。
Read = 1,
//消息已写入。
Written = 2,
//消息已复制。
Copied = 3,
// 消息已关闭,无法再进行访问。
Closed = 4,
}

(1)Created到Read

如果消息Body是一个可序列化的对象,可以通过public T GetBody<T>();将Body内容反序列化为对象,也可以通过public T GetBody<T>(XmlObjectSerializer serializer);指定序列化器。

 static void Main(string[] args)
{
Order order = new Order() { Name = "Order", Price = 88 };
Message msg = Message.CreateMessage(MessageVersion.Soap12, "http://www.cnblogs.com/", order);
Console.WriteLine("MessageState :{0}", msg.State);
Order o2 = msg.GetBody<Order>();
Console.WriteLine("MessageState After Read :{0}", msg.State);
Console.WriteLine("Message Body:{0} {1}", o2.Name, o2.Price);
}

(2)Created到Written

WriteMessage函数内会调用public void WriteMessage(XmlWriter writer);方法。

static void Main(string[] args)
{
Order order = new Order() { Name = "Order", Price = 88 };
Message msg = Message.CreateMessage(MessageVersion.Soap12, "http://www.cnblogs.com/", order);
Console.WriteLine("MessageState :{0}", msg.State);
WriteMessage(msg,@"D:\1.txt");
Console.WriteLine("MessageState After Write :{0}", msg.State);
}

(3)Created到Copied

public MessageBuffer CreateBufferedCopy(int maxBufferSize);

static void Main(string[] args)
{
Order order = new Order() { Name = "Order", Price = 88 };
Message msg = Message.CreateMessage(MessageVersion.Soap12, "http://www.cnblogs.com/", order);
Console.WriteLine("MessageState :{0}", msg.State);
MessageBuffer buffer = msg.CreateBufferedCopy(int.MaxValue);
Console.WriteLine("MessageState After Copy :{0}", msg.State);
Message msgClone = buffer.CreateMessage();
Console.WriteLine("MessageState After Createbybuffer :{0}", msgClone.State);
}

可以将Message变为MessageBuffer,随后Message变为Copied状态。通过MessageBuffer可以无限次的复制消息。

Message小结(一)的更多相关文章

  1. Message小结(二)

    当客户端调用一个WCF接口时,客户端将请求消息发送到服务端,服务端再返回回复消息.WCF内部实现了消息处理的所有细节,但是并不意味着一切不可更改.WCF也提供了一些方法让开发人员在消息发送前对消息进行 ...

  2. C#客户端的异步操作

    上篇博客[用Asp.net写自己的服务框架] 我讲述了如何实现自己的服务框架,但我想很多人应该用过WebService这类服务框架,相比起来,似乎还缺少什么东西, 是的,我也感觉到了.比如:我可以很容 ...

  3. Spring学习总结(二)——静态代理、JDK与CGLIB动态代理、AOP+IoC

    一.为什么需要代理模式 假设需实现一个计算的类Math.完成加.减.乘.除功能,如下所示: package com.zhangguo.Spring041.aop01; public class Mat ...

  4. JavaSE 异常抛光解析

    异常 异常指的是程序中的不正常现象,一般异常都是由第三方数据的使用造成的.java中每种异常现象都会有一个对应的异常类.java对异常的处理方式就是终止程序.异常机制其实是为了帮助我们找到程序中的问题 ...

  5. EventBus vs Otto vs Guava--自定义消息总线

    同步发表于http://avenwu.net/ioc/2015/01/29/custom_eventbus Fork on github https://github.com/avenwu/suppo ...

  6. 【RabbitMQ】2、RabbitMQ入门程序——Hello World

      首先说一下,MQ全称为Message Queue消息队列是一种应用程序对应用程序的通信方法.应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们.消息传递指的是程序 ...

  7. lombok使用总结

    前提 这篇文章主要介绍lombok的使用,至于lombok的源码和原理暂不探究,可以看上一篇文章插件化注解处理API去了解lombok的基本原理.参考资料: lombok官网 lombok官方教程-l ...

  8. python接口自动化(四十)- logger 日志 - 下(超详解)

    简介 按照上一篇的计划,这一篇给小伙伴们讲解一下:(1)多模块使用logging,(2)通过文件配置logging模块,(3)自己封装一个日志(logging)类.可能有的小伙伴在这里会有个疑问一个l ...

  9. [ Python入门教程 ] Python中日志记录模块logging使用实例

    python中的logging模块用于记录日志.用户可以根据程序实现需要自定义日志输出位置.日志级别以及日志格式. 将日志内容输出到屏幕 一个最简单的logging模块使用样例,直接打印显示日志内容到 ...

随机推荐

  1. 使用FluentScheduler实现定时任务管理

    之前定时任务一直用的Windows服务,前段时间发现FluentScheduler这个框架,他跟Quarz.Net,Hangfire一样都是任务调度框架,但是相对使用而言我觉得FluentSchedu ...

  2. Linq to SQL 练习

    public class HomeController : Controller { // // GET: /Home/ empentity entity = new empentity(); pub ...

  3. 利用MVC5+EF6搭建博客系统

    https://www.cnblogs.com/wyt007/p/7880137.html

  4. zoj4019 Schrödinger's Knapsack(dp)

    题意:有两种物品分别为n,m个,每种物品对应价值k1,k2.有一个容量为c的背包,每次将一个物品放入背包所获取的价值为k1/k2*放入物品后的剩余体积.求问所获取的最大价值. 整体来看,优先放入体积较 ...

  5. Adapter as a WCF Binding - In Depth

    WCF LOB Adapter SDK surfaces an adapter as a custom WCF Binding.  A WCF Bindingcorresponds to the “H ...

  6. 大白dmeo (转的)

    <!doctype html><html> <head> <meta charset="utf-8"> <title>B ...

  7. Python小白学习之路(八)—【变量】【基本数据类型分类】【集合】【集合的功能】

    一.变量 变量的作用:记录状态的变化变量的值:描述不同的状态 二.五大基本数据类型的分类 五大基本数据类型(数字 字符串 列表 元祖 字典) 按照可变不可变来进行分类 可变:列表.字典 不可变:字符串 ...

  8. numpy的ravel()和flatten()函数比较

    功能 两个函数的功能都是将多维数组降为一维. 用法 import numpy as np arr = np.array([[1, 2],[3, 4]]) arr.flatten() arr.ravel ...

  9. Fiddler工具详细介绍

    百度看到Fiddler工具的详细介绍,转载收藏,侵权删,原文地址:http://blog.csdn.net/qq_21445563/article/details/51017605 前部分讲解Fidd ...

  10. POJ 1018

    #include<iostream> #define MAXN 105 #define inf 10000000 #include<vector> #include<io ...