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 ...
随机推荐
- spring bean的生命周期
掌握好spring bean的生命周期,对spring的扩展大有帮助. spring bean的生命周期(推荐看) spring bean的生命周期
- django 一些相关问题
这两天在处理django项目时碰到一些问题 1.ur路径设置要忽略大小写,查找了很多资料,都没有发现相关的介绍,最后在谷歌上找到一个解决方案,https://groups.google.com/for ...
- js给数组去重写法
数组为 var list =['A','B','A']; 法一:常规做法,新建list,给list添加元素,添加前判断是否包含 var removeRepeatItem = function(list ...
- 使用jenkins配置.net mvc网站进行持续集成三
前两篇讲解了Jenkins的配置和VS远程发布,现在还有一个问题,VS项目远程发布的时候,配置的是覆盖所有文件重生成的,而通常类似于配置文件这种东西,在本地开发环境和测试环境是不一样的.所以我们通常需 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- [LeetCode] Arithmetic Slices II - Subsequence 算数切片之二 - 子序列
A sequence of numbers is called arithmetic if it consists of at least three elements and if the diff ...
- Winscp开源的SSH|SFTP
WinSCP 主要功能 图形用户界面 多语言与 Windows 完美集成(拖拽, URL, 快捷方式) 支持所有常用文件操作,支持基于 SSH-1.SSH-2 的 SFTP 和 SCP 协议 支持批处 ...
- JSP中编译指令include与动作指令include的区别
include指令是编译阶段的指令,即include所包含的文件的内容是编译的时候插入到JSP文件中,JSP引擎在判断JSP页面未被修改, 否则视为已被修改.由于被包含的文件是在编译时才插入的,因此如 ...
- 基本组件的使用——UINavigationController
作用:在多个ViewController中切换.UINavigationController内部以栈的形式维护一组ViewController, 因此,当导航进入一个新视图的时候,会以push的形式将 ...
- .net core 源码解析-web app是如何启动并接收处理请求(二) kestrel的启动
上篇讲到.net core web app是如何启动并接受请求的,下面接着探索kestrel server是如何完成此任务的. 1.kestrel server的入口KestrelServer.Sta ...