客户端->服务端—>客户端

客户端代码:

using (new OperationContextScope(client.InnerChannel))
           {
               Message request = Message.CreateMessage(OperationContext.Current.OutgoingMessageHeaders.MessageVersion,
                   "http://Microsoft.ServiceModel.Samples/IService1/Sum", values);

请求

Message reply = client.Sum(request);

获取应答结果:

int sum = reply.GetBody<int>();
               Console.WriteLine("Sum(1,2,3,4,5) = {0}", sum);

服务端代码:

public Message Sum(Message request)
       {
           int sum = 0;
           string text = "";

//获取消息的body节点

XmlReader body = request.GetReaderAtBodyContents();

while (body.Read())
           {
               text = body.ReadString().Trim();
               if (text.Length > 0)
               {
                   sum += Convert.ToInt32(text, CultureInfo.InvariantCulture);
               }
           }
           body.Close();

Message response = Message.CreateMessage(request.Version, "http://Microsoft.ServiceModel.Samples/IService1/SumResponse", sum);
           return response;

}

2.所有服务端代码

public Message Sum(Message request)
       {
           int sum = 0;
           string text = "";

//The body of the message contains a list of numbers which will be read directly using an XmlReader
           XmlReader body = request.GetReaderAtBodyContents();

while (body.Read())
           {
               text = body.ReadString().Trim();
               if (text.Length > 0)
               {
                   sum += Convert.ToInt32(text, CultureInfo.InvariantCulture);
               }
           }
           body.Close();

Message response = Message.CreateMessage(request.Version, "http://Microsoft.ServiceModel.Samples/IService1/SumResponse", sum);
           return response;

}

public Message GetFirst()
       {
           MessageVersion ver = OperationContext.Current.IncomingMessageVersion;
           return Message.CreateMessage(ver, "http://Microsoft.ServiceModel.Samples/IService1/GetFirstResponse");
       }

public Message GetData()
       {
           Person p = new Person();
           p.name = "wang";
           p.age = 20;
           MessageVersion ver = OperationContext.Current.IncomingMessageVersion;
           return Message.CreateMessage(ver, "http://Microsoft.ServiceModel.Samples/IService1/GetDataResponse", p);
       }

public Message GetDataStream()
       {
           FileStream stream = new FileStream(@"myfile.xml", FileMode.Open);
           XmlDictionaryReader xdr =
                  XmlDictionaryReader.CreateTextReader(stream,
                              new XmlDictionaryReaderQuotas());
           MessageVersion ver =
               OperationContext.Current.IncomingMessageVersion;
           return Message.CreateMessage(ver, "http://Microsoft.ServiceModel.Samples/IService1/GetDataStreamResponse", xdr);
       }

public Message GetDataFault()
       {
           FaultCode fc = new FaultCode("Receiver");
           MessageVersion ver = OperationContext.Current.IncomingMessageVersion;
           return Message.CreateMessage(ver, fc, "Bad data", "http://Microsoft.ServiceModel.Samples/IService1/GetDataFaultResponse");
       }

}

[DataContract(Namespace = "http://schemas.datacontract.org/2004/07/WcfServiceLibrary1")]
   public class Person
   {
       [DataMember]
       public string name;
       [DataMember]
       public int age;
   }

所有客户端代码:

int[] values = { 1, 2, 3, 4, 5 };

using (new OperationContextScope(client.InnerChannel))
            {
                Message request = Message.CreateMessage(OperationContext.Current.OutgoingMessageHeaders.MessageVersion,
                    "http://Microsoft.ServiceModel.Samples/IService1/Sum", values);

//Console.WriteLine(request.ToString());

Message reply = client.Sum(request);

//Console.WriteLine(reply.ToString());

int sum = reply.GetBody<int>();
                Console.WriteLine("Sum(1,2,3,4,5) = {0}", sum);

// demo 1
                Message Reply1 = client.GetFirst();
                Console.WriteLine(Reply1.ToString());

// demo 2
                Message reply2 = client.GetData();
                Console.WriteLine(reply2.ToString());
                Person p = reply2.GetBody<Person>();
                Console.WriteLine(p.name + "    " + p.age.ToString());

// demo 3
                Message reply3 = client.GetDataStream();
                Console.WriteLine(reply3.ToString());
                FileStream stream = new FileStream(@"c:\log.xml", FileMode.Create);
                XmlDictionaryWriter xdw =
                    XmlDictionaryWriter.CreateTextWriter(stream);
                //reply1.WriteBodyContents(xdw);
                //reply1.WriteBody(xdw);
                reply3.WriteMessage(xdw);
                xdw.Flush();

// demo 4
                try
                {
                    Message reply1 = client.GetDataFault();
                    Console.WriteLine(reply1.ToString());
                }
                catch (FaultException e)
                {
                    Console.WriteLine(e.ToString());
                }

Console.WriteLine("=====================Demo5========================");
                // demo 5
                Message reply5 = client.GetDataStream();
                //Copy the message to a buffer.
                MessageBuffer mb = reply5.CreateBufferedCopy(65536);

//Log to a file.
                FileStream stream1 = new FileStream(@"C:\log.xml", FileMode.Append);
                mb.WriteMessage(stream1);
                stream1.Flush();

Console.WriteLine("=====================Demo6========================");
                Message reply6 = client.GetData();
                Console.WriteLine(reply6.ToString());
                foreach (MessageHeaderInfo mhi in reply6.Headers)
                {
                    Console.WriteLine(mhi.Name);
                }

}

注意消息的版本

artech的文章

http://www.cnblogs.com/artech/archive/2009/07/27/1532438.html

源码:http://files.cnblogs.com/lzhp/WcfMessageService.zip

wcf中的Message类的更多相关文章

  1. WCF初探-22:WCF中使用Message类(上)

    前言 从我们学习WCF以来,就一直强调WCF是基于消息的通信机制.但是由于WCF给我们做了高级封装,以至于我们在使用WCF的时候很少了解到消息的内部机制.由于WCF的架构的可扩展性,针对一些特殊情况, ...

  2. WCF初探-23:WCF中使用Message类(下)

    前言 在上一篇WCF中使用Message类(上)中,文章介绍了WCF中使用Message类的基本知识和怎样创建消息,本文是承接上一篇文章,如果想要更好的阅读本文,请先阅读上一篇文章.在这篇文章中,我将 ...

  3. WCF初探-25:WCF中使用XmlSerializer类

    前言 在上一篇WCF序列化和反序列化中,文章介绍了WCF序列化和反序列化的机制,虽然WCF针对序列化提供了默认的DataContractSerializer序列化引擎,但是WCF还支持其他的序列化引擎 ...

  4. WCF基础之Message类

    客户端和服务端的通信都是通过接收和发送的Message实例建立起来的,大多数情况我们通过服务协定.数据协定和消息协定来构造传入和传出消息的. 一般什么时候使用Message类呢?不需要将消息序列化或者 ...

  5. WCF中,通过C#代码或App.config配置文件创建ServiceHost类

    C# static void Main(string[] args) { //创建宿主的基地址 Uri baseAddress = new Uri("http://localhost:808 ...

  6. 在 WCF 中使用高效的 BinaryFormatter 序列化

    本文将定义一个 WCF 终结点行为扩展,以在 WCF 中使用更高效的 BinaryFormatter 进行二进制序列化,并实现对是否使用传统二进制序列化功能的可配置. 介绍 实现步骤 使用方法 效果 ...

  7. WCF初探-28:WCF中的并发

    理解WCF中的并发机制 在对WCF并发机制进行理解时,必须对WCF初探-27:WCF中的实例化进行理解,因为WCF中的并发特点是伴随着服务实例上下文实现的.WCF的实例上下文模型可以通过Instanc ...

  8. WCF初探-27:WCF中的实例化

    理解WCF中的实例化机制 “实例化”是指对用户定义的服务对象以及与其相关的 InstanceContext 对象的生存期的控制.也就是说我们的客户端程序在调用服务端方法时,需要实例化一个服务端代理类对 ...

  9. WCF初探-26:WCF中的会话

    理解WCF中的会话机制 在WCF应用程序中,会话将一组消息相互关联,从而形成对话.会话”是在两个终结点之间发送的所有消息的一种相互关系.当某个服务协定指定它需要会话时,该协定会指定所有调用(即,支持调 ...

随机推荐

  1. 在Linux上yum安装运行Redis,只能安装2.4.10(主从)

    Installing Redis on CentOS 6.4 First, install the epel repo sudo rpm -Uvh http://download.fedoraproj ...

  2. JetBrains C++ IDE CLion配置与评测

    等了大半年的JetBrains C++ IDE千呼万唤始出来!上次我猜2014年肯定发布,今天经@wet2_cn同学的提醒,我去官博一看,嘿!有了!赶紧安装试了一把,感觉这是迄今为止用过最好的Cpp ...

  3. canOpenURL: failed for URL: "weixin://app/wx 问题解决方式

    canOpenURL: failed for URL: “weixin://app/wx 问题解决方式: 在info.plist里面添加以下内容: <key>LSApplicationQu ...

  4. Oracle 12C -- 在相同的列的集合上创建多个索引

    在12C中,可以在相同的列的集合上创建多个索引,但是多个索引的类型要不同.同一时刻,只有一个是可见的. SQL> create table emp_tab as select * from em ...

  5. samba 服务器搭建

    为了能在两台机器上共享代码,方便测试不同平台性能和搭建分布式的web server,今天耗费半天时间搭建一个samba服务器共享数据,要求开放写权限,但多次实验均告失败,最终在 鸟哥 的提醒下 检查发 ...

  6. ekho安装及测试(中文文字转语音)

    1. 官网下载源码包 地址:http://www.eguidedog.net/ekho.php 2. 安装 xz -d ekho-7.5.tar.xz tar -xvf ekho-7.5.tar ap ...

  7. 【转】java原理—反射机制

    一.什么是反射:反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序语言 ...

  8. Android事件处理的2种方式:监听器与回调

    android组件的事件处理有2种方式: 1.基于监听器的事件处理方式:先定义组件,然后为组件设定监听器. 详见http://blog.csdn.net/jediael_lu/article/deta ...

  9. Java 8 Optional In Depth

    OptionalBasicExample.java package com.mkyong; import java.util.Optional; public class OptionalBasicE ...

  10. 在 Mac 上使用多点触控手势

    使用多点触控触控板或妙控鼠标,可以通过轻点.轻扫.捏合或开合一根或多根手指进行有用的操作. 触控板手势 有关这些手势的更多信息,请选取苹果菜单 () >“系统偏好设置”,然后点按“触控板”.您 ...