好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

wcf 随笔1

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~下面上图

调用之前:

调用之后:

 

分类:  C#学习笔记

标签:  wcf

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于wcf 随笔1的详细内容...

  阅读:47次