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的更多相关文章

  1. 第二章 简单的HTTP协议

    第二章 简单的HTTP协议 针对HTTP协议结构进行讲解 1.通过请求和响应的交换来达成通信目的 应用HTTP协议时,必定是一端担任客户端角色,另一端担任服务器端角色. [请求报文]是由请求方法.UR ...

  2. perl5 第二章 简单变量

    第二章 简单变量  by flamephoenix 一.整型 二.浮点数 三.字符串 基本上,简单变量就是一个数据单元,这个单元可以是数字或字符串.一.整型 1.整型   PERL最常用的简单变量,由 ...

  3. 《WCF技术内幕》翻译3:第1部分_第1章_蓝月亮:普遍需求和普遍概念

    第一部分:WCF介绍    章节目录:    第1章:蓝月亮    第2章:面向服务    第3章:消息交换模式.拓扑和编排    第4章:WCF 101 第1章:蓝月亮    商业和市场对软件系统新 ...

  4. 《图解HTTP》阅读笔记--第二章 简单的HTTP协议--第三章 HTTP报文信息

     第二章.简单的HTTP协议HTTP协议:HTTP协议用于客户端(请求资源的一端)和服务器端(响应回复提供资源的一端)的通信,是一种无状态协议HTTP1.1默认TCP持久连接,管线化发送(并行发送多个 ...

  5. iOS面试用到的知识点和技术点--第二章

    接着第一章的继续  昨天没有更新,很抱歉 1.Socket编程 以及一些第三方框架Socket-IO GCDAsyncSocket通信框架? 1.使用系统自带的CFsocket 2.第三方Socket ...

  6. 【图解HTTP】第二章 简单的http协议

    简单的HTTP协议 针对HTTP协议结构进行讲解,主要使用HTTP/1.1版本. HTTP协议用于客户端和服务器端之间的通信 通过请求和响应的交换达成通信(从客户端开始建立通信,服务器端在没有接收到请 ...

  7. 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 ...

  8. 《redis 5设计与源码分析》:第二章 简单动态字符串

    介绍 简单动态字符串(Simple Dynamic Strings, SDS)是Redis的基本数据结构之一,用于存储字符串和整型数据.它的特点是:方便扩容.二进制安全. 二进制安全 在C语言中,用& ...

  9. Hadoop技术内幕-第一章 阅读原代码前的准备

    1.1 源代码学习环境 1.1.1 基础软件的下载 JDK-http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads ...

随机推荐

  1. 使用selenium编写脚本常见问题(一)

    前提:我用selenium IDE录制脚本,我用java写的脚本,如果大家想看的清楚明白推荐java/Junit4/Webdriver 我用的是java/TestNG/remote control 1 ...

  2. SpringMVC入门案例及请求流程图(关于处理器或视图解析器或处理器映射器等的初步配置)

    SpringMVC简介:SpringMVC也叫Spring Web mvc,属于表现层的框架.Spring MVC是Spring框架的一部分,是在Spring3.0后发布的 Spring结构图 Spr ...

  3. [LeetCode] Valid Word Abbreviation 验证单词缩写

    Given a non-empty string s and an abbreviation abbr, return whether the string matches with the give ...

  4. [LeetCode] Remove K Digits 去掉K位数字

    Given a non-negative integer num represented as a string, remove k digits from the number so that th ...

  5. [LeetCode] Scramble String 爬行字符串

    Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrin ...

  6. js版面向对象图片放大镜

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>放 ...

  7. grails项目获取前后台的值

    grails项目中前台传值给后台: 加入我有a.gsp这个页面,a.gsp中有如下代码: 姓名:<input type="text" name="xing" ...

  8. javascript中正则实现读取当前url中指定参数值方法。

    getQueryString:function(name) { var reg = new RegExp("(^|&)"+ name +"=([^&]*) ...

  9. WPF学习系列 简单的窗体设置

    今天要学习的源码是一个窗体设置.效果如下,可拖拽.这让我想起了vs的启动界面 下面是源码的情况 项目结构: 窗体代码: cs代码 1.新建项目 略 2.设置窗体 AllowsTransparency= ...

  10. ubuntu终端窗口最大化(不是全屏)

    窗口最大化:ctrl+win窗+↑ 窗口还原:ctrl+win窗+↓ 这快捷键让人无语.好好的gnome被改造成unity,快捷键也改掉了.win窗+↑/↓为啥不用呢? 还有就是terminal的ta ...