zoukankan      html  css  js  c++  java
  • wcf 随笔1

    从刚开始工作到现在,也有一年半了...期间读了不少与技术相关的书籍,但是之前总是一味的去看,很少动手,从去年的11月份开始学习wcf,手上的资料也不少,看得倒是很多,但是由于自己是个新人,要把这个通讯框架搞懂还真是有点困难,买了本<wcf技术内幕>,感觉这本书讲得很深撒...从开始学习到现在基本上是第三遍了,第一遍基本上算是走过场了,里面很多东西对于我这个菜鸟来说简直!@#$%......第二遍,结合目前正在做的项目,算是有点眉目了,现在是第三遍,觉得收获真是不少,所以打算边看边记录下来..下面进入正题.

     wcf最主要的目的是为了通讯,那么就为了实现简单的通讯,我建了两个简单的项目,方便起见,就用控制台程序....一个做服务端,侦听,另一个做客户端,调用服务...那么首先我们需要完成服务端的内容,要创建一个线程来侦听是否有消息到来,wcf里面涉及到ABC,A为address,就是服务部署的地址,B为binding,即为绑定,这里不过多的探讨绑定的模式,因为只是想实现简单的基于消息的通讯,所以选择WSHttpBinding,这个绑定模式是基于http协议的,如果想用其它方式(比如二进制或者是基于tcp/ip协议)传输,可以考虑其它的绑定模式哈....C为contract,即为契约.先上服务端的代码:

    复制代码
        class Program
        {
            static void Main(string[] args)
            {
                //创建绑定
                WSHttpBinding wsbind = new WSHttpBinding(SecurityMode.None);
    
                //指定传输的编码协议
                wsbind.MessageEncoding = WSMessageEncoding.Text;
                
                //指定服务的地址
                Uri _uri = new Uri(@"http://localhost:4000/Order");
    
                //使用MyOrder实例化宿主服务
                ServiceHost host = new ServiceHost(typeof(MyOrder));
    
                //添加一个终结点
                host.AddServiceEndpoint(typeof(IProcessOrder), wsbind, _uri);
    
                //开启服务,开始侦听
                host.Open();
    
                Console.WriteLine("服务已经启动....");
                Console.ReadLine();
    
                //关闭服务
                host.Close();
            }
        }
        //定义服务的契约
        [ServiceContract]
        public interface IProcessOrder
        {
            [OperationContract(Action="submitorder")]
            void SubmitOrder(Message order);
        }
        //定义类实例接口
        public class MyOrder : IProcessOrder
        {
            public void SubmitOrder(Message order)
            {
                Console.WriteLine("Message已经到达,ID为{0}:",order.Headers.MessageId.ToString());
            }
        }
    复制代码

    以上便是服务端的全部代码,很简单吧,注释也写上了.....

    下面是客户端:

    复制代码
        class Program
        {
            static void Main(string[] args)
            {
                Console.ReadLine();
    
                //创建一个终结点,地址为接收程序的地址
                EndpointAddress address = new EndpointAddress(@"http://localhost:4000/Order");
    
                WSHttpBinding bind = new WSHttpBinding(SecurityMode.None);
    
                //创建通道
                ChannelFactory<IProcessOrder> channel = new ChannelFactory<IProcessOrder>(bind, address);
    
    
                //使用通道工厂创建代理
                IProcessOrder proxy = channel.CreateChannel();
    
                //创建消息
                Message msg = null;
                for (int i = 0; i < 10;i++ )
                {
                    msg = GetMsg(i, i) ;
                    msg.Headers.MessageId = new UniqueId(i.ToString());
                    msg.Headers.Action = "submitorder";
                    proxy.SubmitOrder(msg);
                }
                Console.ReadLine();
            }
            public static Message GetMsg(int id,int number)
            {
                MemoryStream ms = new MemoryStream();
    
                XmlDictionaryWriter writer = XmlDictionaryWriter.CreateTextWriter(ms,Encoding.UTF8,false);
    
                writer.WriteStartElement("Order");
                writer.WriteElementString("ID", id.ToString());
                writer.WriteElementString("ID", (number*5).ToString());
                writer.WriteEndElement();
    
                writer.Flush();
                ms.Position = 0;
    
                XmlDictionaryReader reader = XmlDictionaryReader.CreateTextReader(ms, XmlDictionaryReaderQuotas.Max);
    
                return Message.CreateMessage(MessageVersion.Soap12WSAddressing10, string.Empty, reader);
     
            }
        }
        //定义服务的契约
        [ServiceContract]
        public interface IProcessOrder
        {
            [OperationContract(Action = "submitorder")]
            void SubmitOrder(Message order);
        }
    复制代码

    客户端要想调用服务端的服务必须要知道1.服务的地址,2.服务的契约,3.服务的绑定要一致.这里我们通过终结点来关联服务,终结点其实就是服务发送消息的目标.绑定和终结点窗建好了之后,我们通过通道工厂创建一个通道,这个时候就要将契约指定上,否则到了服务端,都不知道如何分发了...通道创建好了之后说明已经和服务建立了连接了,下面要创建服务的代理,进而调用服务..通过CreateChannel()方法返回代理.这样整个服务端和客户端就可以进行通讯了..

    为了测试,创建了消息对象,并指定了消息的id和消息的Action,这里的action必须要和契约里面的action一致,否则会报异常.

    OK~下面上图

    调用之前:

    调用之后:

     
    标签: wcf
  • 相关阅读:
    第24章、OnLongClickListener长按事件(从零开始学Android)
    第21章、OnItemSelectedListener事件(从零开始学Android)
    GIS开源软件大全
    How to configure SRTM elevations in WorldWind WMS
    [转]SRTM、ASTER GDEM等全球数字高程数据(DEM)下载方式简介
    SRTM数据介绍与说明
    [转]基于四叉树(QuadTree)的LOD地形实现
    [转]World Wind学习总结一
    [转]World Wind Java开发之四——搭建本地WMS服务器
    [转]World Wind Java开发之五——读取本地shp文件
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2695942.html
Copyright © 2011-2022 走看看