WCF技术内幕 第二章 - 简单的Message
1.契约 - 接口 (客户端和服务端都要认识Message)
namespace WCFService
{
[ServiceContract(Namespace = "http://wintellect.com/ProcessOrder")]
public interface IOrderContract
{
[OperationContract(Action="urn:SubmitOrder")]
void SubmitOrder(Message order);
}
}
2.服务端实现服务
namespace WCFService
{
public sealed class MyService : IOrderContract
{
public void SubmitOrder(Message order)
{
string fileName = "Order" + order.Headers.MessageId.ToString() + ".xml";
Console.WriteLine("Message ID {0} received", order.Headers.MessageId.ToString());
System.Xml.XmlDictionaryWriter writer = System.Xml.XmlDictionaryWriter.CreateTextWriter(new FileStream(fileName, FileMode.Create)); order.WriteMessage(writer);
writer.Close();
}
}
}
3.创建服务代理,对请求进行服务
namespace WCFService
{
class Program
{
static void Main(string[] args)
{
WSHttpBinding binding = new WSHttpBinding(SecurityMode.None); binding.MessageEncoding = WSMessageEncoding.Text; Uri addressURI = new Uri(@"http://localhost:4000/Order"); ServiceHost svc = new ServiceHost(typeof(MyService));
svc.AddServiceEndpoint(typeof(IOrderContract), binding, addressURI); svc.Open();
Console.WriteLine("The receiver is ready...");
Console.ReadLine(); svc.Close();
}
}
}
4.客户端构造Message,发送服务请求
4.1.构造消息体
public static Message GenerateMessage(Int32 productId, Int32 qty)
{
MemoryStream stream = new MemoryStream(); XmlDictionaryWriter writer = XmlDictionaryWriter.CreateTextWriter(stream, Encoding.UTF8, false); writer.WriteStartElement("SubmitOrder");
writer.WriteElementString("ProdID", productId.ToString());
writer.WriteElementString("Qty", qty.ToString());
writer.WriteEndElement(); writer.Flush();
stream.Position = ; XmlDictionaryReader reader = XmlDictionaryReader.CreateTextReader(stream, XmlDictionaryReaderQuotas.Max); return Message.CreateMessage(MessageVersion.Soap12WSAddressing10, string.Empty, reader);
}
4.2.构造消息头,并创建请求服务代理
namespace WCFClinet
{
class Program
{
static void Main(string[] args)
{
EndpointAddress address = new EndpointAddress(@"http://localhost:4000/Order");
WSHttpBinding binding = new WSHttpBinding(SecurityMode.None);
binding.MessageEncoding = WSMessageEncoding.Text; ChannelFactory<IOrderContract> channel = new ChannelFactory<IOrderContract>(binding, address);
IOrderContract proxy = channel.CreateChannel(); Message msg = null;
for (Int32 i = ; i < ; i++)
{
msg = GenerateMessage(i, i); UniqueId uniqueId = new UniqueId(i.ToString());
msg.Headers.MessageId = uniqueId; Console.WriteLine("Sending msg # {0}", uniqueId.ToString()); msg.Headers.Action = "urn:SubmitOrder";
proxy.SubmitOrder(msg);
}
}
5.查看服务端接收到的消息(第三个Message)
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
<s:Header>
<a:Action s:mustUnderstand="1">urn:SubmitOrder</a:Action>
<a:MessageID>3</a:MessageID>
<a:ReplyTo>
<a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
</a:ReplyTo>
<a:To s:mustUnderstand="1">http://localhost:4000/Order</a:To>
</s:Header>
<s:Body>
<SubmitOrder>
<ProdID>3</ProdID>
<Qty>3</Qty>
</SubmitOrder>
</s:Body>
</s:Envelope>
WCF技术内幕 第二章 - 简单的Message的更多相关文章
- 第二章 简单的HTTP协议
第二章 简单的HTTP协议 针对HTTP协议结构进行讲解 1.通过请求和响应的交换来达成通信目的 应用HTTP协议时,必定是一端担任客户端角色,另一端担任服务器端角色. [请求报文]是由请求方法.UR ...
- perl5 第二章 简单变量
第二章 简单变量 by flamephoenix 一.整型 二.浮点数 三.字符串 基本上,简单变量就是一个数据单元,这个单元可以是数字或字符串.一.整型 1.整型 PERL最常用的简单变量,由 ...
- 《WCF技术内幕》翻译3:第1部分_第1章_蓝月亮:普遍需求和普遍概念
第一部分:WCF介绍 章节目录: 第1章:蓝月亮 第2章:面向服务 第3章:消息交换模式.拓扑和编排 第4章:WCF 101 第1章:蓝月亮 商业和市场对软件系统新 ...
- 《图解HTTP》阅读笔记--第二章 简单的HTTP协议--第三章 HTTP报文信息
第二章.简单的HTTP协议HTTP协议:HTTP协议用于客户端(请求资源的一端)和服务器端(响应回复提供资源的一端)的通信,是一种无状态协议HTTP1.1默认TCP持久连接,管线化发送(并行发送多个 ...
- iOS面试用到的知识点和技术点--第二章
接着第一章的继续 昨天没有更新,很抱歉 1.Socket编程 以及一些第三方框架Socket-IO GCDAsyncSocket通信框架? 1.使用系统自带的CFsocket 2.第三方Socket ...
- 【图解HTTP】第二章 简单的http协议
简单的HTTP协议 针对HTTP协议结构进行讲解,主要使用HTTP/1.1版本. HTTP协议用于客户端和服务器端之间的通信 通过请求和响应的交换达成通信(从客户端开始建立通信,服务器端在没有接收到请 ...
- WCF全面解析第二章 地址(Adress)
2.1 统一资源标识(URL) 2.1.1 Http/Https 2.1.2 Net.TCP 2.1.3 Net.Pipe WCF只将命名管道专门用于同一台机器的跨进程通信. 2.1.4 Net.Ms ...
- 《redis 5设计与源码分析》:第二章 简单动态字符串
介绍 简单动态字符串(Simple Dynamic Strings, SDS)是Redis的基本数据结构之一,用于存储字符串和整型数据.它的特点是:方便扩容.二进制安全. 二进制安全 在C语言中,用& ...
- Hadoop技术内幕-第一章 阅读原代码前的准备
1.1 源代码学习环境 1.1.1 基础软件的下载 JDK-http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads ...
随机推荐
- RabbitMQ调试与测试工具-v1.0.1 -提供下载测试与使用
最近几天在看RabbitMQ,所以发了两天时间写了一个调试和测试工具.方便使用. 下载地址:RabbitMQTool-V1.0.1.zip
- Linux NFS服务器的安装与配置
一.NFS服务简介 NFS 是Network File System的缩写,即网络文件系统.一种使用于分散式文件系统的协定,由Sun公司开发,于1984年向外公布.功能是通过网络让不同的机器.不同的操 ...
- 排序算法----基数排序(RadixSort(L,max))单链表版本
转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...
- [转].NET Core中的认证管理解析
本文转自:http://www.cnblogs.com/durow/p/5783089.html 0x00 问题来源 在新建.NET Core的Web项目时选择“使用个人用户账户”就可以创建一个带有用 ...
- Apache:如何访问共享目录
环境说明:Apache的版本是2.4.10,共享目录有两种情况,一种是windows server的目录共享,还有一种是linux的NAS.无论访问哪一种共享目录,都需要用户名和密码. 问题说明:如何 ...
- 一个virtualbox开机即aborted的问题解决
问题: 之前想装最新的virtualbox版本,从官网下载了virtualbox最新的5点几的版本,使用sudo dpkg -i *.deb进行安装的. 然而,在virtualbox中启动了ubunt ...
- javascript中的自执行函数
学习es6的时候遇到了自执行函数,感觉有必要写下来,一方面加深自己的记忆,另一方面还能分享给大家. 什么是自执行函数? 自执行函数就是为了不污染全局变量命名空间的一中匿名函数,相当于自己创建了一个作用 ...
- Spring.net 配置说明
Spring.net使用说明 使用方法: 1.在配置文件设置Spring.net 节点 在配置节中,声明Spring.net,配置 context,objects 标签,来源(type) < ...
- [LeetCode] Zigzag Iterator 之字形迭代器
Given two 1d vectors, implement an iterator to return their elements alternately. For example, given ...
- AppBox_v2.0完整版免费下载,暨AppBox_v3.0正式发布!
文章更新: AppBox v6.0中实现子页面和父页面的复杂交互 AppBox 是基于 FineUI 的通用权限管理框架,包括用户管理.职称管理.部门管理.角色管理.角色权限管理等模块. AppBox ...