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 ...
随机推荐
- Unity性能优化(4)-官方教程Optimizing graphics rendering in Unity games翻译
本文是Unity官方教程,性能优化系列的第四篇<Optimizing graphics rendering in Unity games>的翻译. 相关文章: Unity性能优化(1)-官 ...
- LAMP环境配置 linux+apache+mysql+php
虚拟机安装Linux系统: 新建虚拟机过程中选择Linux,下面选择centos或者是Ubuntu Linux切换图像命令:注意只有装了图像界面才可以切换 查看安装环境的版本: rpm -qa 查看安 ...
- [No000090]C#捕获控制台(console)关闭事件及响应cmd快捷键
捕获控制台(console)关闭事件: 1.Ctrl+C信号: 2.Ctrl+Break信号: 3.用户系统关闭Console时: 4.用户退出系统时: 5.系统将要关闭时: using System ...
- [No0000A9]实用word用法
目录 TOC \o "1-3" \h \z \u 三招去掉页眉那条横线.... PAGEREF _Toc465252982 \h 08D0C9EA79F9BACE118C8200 ...
- javascript中的自执行函数
学习es6的时候遇到了自执行函数,感觉有必要写下来,一方面加深自己的记忆,另一方面还能分享给大家. 什么是自执行函数? 自执行函数就是为了不污染全局变量命名空间的一中匿名函数,相当于自己创建了一个作用 ...
- Django基础,Day1 - 环境安装与pycharm创建django项目
Django是一个高级Python Web框架,支持快速部署,清理和实用的设计.它可以被轻易部署和提供实用的组件,而开发人员只需要专注于写自己的应用程序,而不需要重复造轮子.并且Django是自由和开 ...
- [LeetCode] Convert a Number to Hexadecimal 数字转为十六进制
Given an integer, write an algorithm to convert it to hexadecimal. For negative integer, two’s compl ...
- [LeetCode] Missing Ranges 缺失区间
Given a sorted integer array where the range of elements are [0, 99] inclusive, return its missing r ...
- C#调用vbs脚本实现Windows版Siri
最近新加入,把自己一些有意思的小东西分享给大家,我是一个学生,代码写得少,哪里不规范,希望大家见谅. 这事我封装好的一个类,可以直接实例化对象之后,调用"对象.Talk()"方法, ...
- .NET跨平台之旅:生产环境中第2个跑在Linux上的ASP.NET Core站点
今天我们在生产环境中上线了第2个跑在Linux上的ASP.NET Core站点.这是一个简单的Web API站点,通过命令行的方式调用安装在Linux服务器上的程序完成操作.之前用的是nodejs,现 ...