Message小结(一)
一、消息版本
为了区别消息的结构和寻址机制,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小结(一)的更多相关文章
- Message小结(二)
当客户端调用一个WCF接口时,客户端将请求消息发送到服务端,服务端再返回回复消息.WCF内部实现了消息处理的所有细节,但是并不意味着一切不可更改.WCF也提供了一些方法让开发人员在消息发送前对消息进行 ...
- C#客户端的异步操作
上篇博客[用Asp.net写自己的服务框架] 我讲述了如何实现自己的服务框架,但我想很多人应该用过WebService这类服务框架,相比起来,似乎还缺少什么东西, 是的,我也感觉到了.比如:我可以很容 ...
- Spring学习总结(二)——静态代理、JDK与CGLIB动态代理、AOP+IoC
一.为什么需要代理模式 假设需实现一个计算的类Math.完成加.减.乘.除功能,如下所示: package com.zhangguo.Spring041.aop01; public class Mat ...
- JavaSE 异常抛光解析
异常 异常指的是程序中的不正常现象,一般异常都是由第三方数据的使用造成的.java中每种异常现象都会有一个对应的异常类.java对异常的处理方式就是终止程序.异常机制其实是为了帮助我们找到程序中的问题 ...
- EventBus vs Otto vs Guava--自定义消息总线
同步发表于http://avenwu.net/ioc/2015/01/29/custom_eventbus Fork on github https://github.com/avenwu/suppo ...
- 【RabbitMQ】2、RabbitMQ入门程序——Hello World
首先说一下,MQ全称为Message Queue消息队列是一种应用程序对应用程序的通信方法.应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们.消息传递指的是程序 ...
- lombok使用总结
前提 这篇文章主要介绍lombok的使用,至于lombok的源码和原理暂不探究,可以看上一篇文章插件化注解处理API去了解lombok的基本原理.参考资料: lombok官网 lombok官方教程-l ...
- python接口自动化(四十)- logger 日志 - 下(超详解)
简介 按照上一篇的计划,这一篇给小伙伴们讲解一下:(1)多模块使用logging,(2)通过文件配置logging模块,(3)自己封装一个日志(logging)类.可能有的小伙伴在这里会有个疑问一个l ...
- [ Python入门教程 ] Python中日志记录模块logging使用实例
python中的logging模块用于记录日志.用户可以根据程序实现需要自定义日志输出位置.日志级别以及日志格式. 将日志内容输出到屏幕 一个最简单的logging模块使用样例,直接打印显示日志内容到 ...
随机推荐
- 使用FluentScheduler实现定时任务管理
之前定时任务一直用的Windows服务,前段时间发现FluentScheduler这个框架,他跟Quarz.Net,Hangfire一样都是任务调度框架,但是相对使用而言我觉得FluentSchedu ...
- Linq to SQL 练习
public class HomeController : Controller { // // GET: /Home/ empentity entity = new empentity(); pub ...
- 利用MVC5+EF6搭建博客系统
https://www.cnblogs.com/wyt007/p/7880137.html
- zoj4019 Schrödinger's Knapsack(dp)
题意:有两种物品分别为n,m个,每种物品对应价值k1,k2.有一个容量为c的背包,每次将一个物品放入背包所获取的价值为k1/k2*放入物品后的剩余体积.求问所获取的最大价值. 整体来看,优先放入体积较 ...
- 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 ...
- 大白dmeo (转的)
<!doctype html><html> <head> <meta charset="utf-8"> <title>B ...
- Python小白学习之路(八)—【变量】【基本数据类型分类】【集合】【集合的功能】
一.变量 变量的作用:记录状态的变化变量的值:描述不同的状态 二.五大基本数据类型的分类 五大基本数据类型(数字 字符串 列表 元祖 字典) 按照可变不可变来进行分类 可变:列表.字典 不可变:字符串 ...
- numpy的ravel()和flatten()函数比较
功能 两个函数的功能都是将多维数组降为一维. 用法 import numpy as np arr = np.array([[1, 2],[3, 4]]) arr.flatten() arr.ravel ...
- Fiddler工具详细介绍
百度看到Fiddler工具的详细介绍,转载收藏,侵权删,原文地址:http://blog.csdn.net/qq_21445563/article/details/51017605 前部分讲解Fidd ...
- POJ 1018
#include<iostream> #define MAXN 105 #define inf 10000000 #include<vector> #include<io ...