WCF 三步曲(上)

    这几天都在举国声讨铁道部,央视的晚间新闻主持人启明的质问声是那样的铿锵有力,能不能让我们乘坐一辆安全抵达的列车?能不能出了事情以后不要急着把车头埋掉?腾飞中的中国,请放慢你的脚步,跑的太快,不要把人的灵魂落在了后面。面对着对天朝下众多让人气愤的事情,想静下心来写点东西都很困难。

         虽然现在我想写的是WCF的入门,想先说说IIS的事情, 这个我们搞ASP.NET开发整天与之打交道的发布程序的软件究竟是什么,当然,如果要探其究竟的话,是一个很深层次事情,也不是一时半刻就能探索出结果。不管是WCF,还是之前的Webservice都还是基于socket通讯的基础之上,举个简单的例子,服务器的程序一般会写成

         //// TcpListener server = new TcpListener(port);

                 server = new TcpListener(localAddr, port);

                // Start listening for client requests.

                server.Start();

                // Buffer for reading data

                Byte[] bytes = new Byte[1056];

                String data = null;

                // Enter the listening loop.

                while (true)

                {

                    //Console.Write("Waiting for a connection... ");

                    ListenerLog.Info("Waiting for a connection... ");

                    // Perform a blocking call to accept requests.

                    // You could also user server.AcceptSocket() here.

                    TcpClient client = server.AcceptTcpClient();

                    ListenerLog.Info("Connected!");

                    //Console.WriteLine("Connected!");

                    data = null;

                    // Get a stream object for reading and writing

                    NetworkStream stream = client.GetStream();

                    int i;

                    // Loop to receive all the data sent by the client.

                    while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)

                    {}

                 }

           (抄自MSDN

    简单来说,就是霸占一个端口,以指定的通迅协议来接收数据。IIS做的事情不过也就是这样的,霸点一个端口,接收客户端数据,当然了IIS有着更多更强大的功能。

言归正传,回到WCF的话题上来,我想直接拿一个完整的程序来剖析,在《Learning WCF Master Windows Communication Foundation and SOA Fundamentals》书的示例代中有个实例介绍基于 TCPHTTP 协议的双工通信的例子,位于Chapter3\Duplex\Duplex.sln ;

该解决方案下面有4个项目,分别是ClientHelloIndigoHostWinClient.如果你想运行程序,可以将Client,Host都设置为启动项目,运行以后会在命令行窗口显示一些输出。如果你在Client项目的Program.cs程序里打上断点,会发现项目的执行顺序是Client->HelloIndio->Client。这就是一个完整WCF程序的例子,后面详细说明。

现在一个应用系统已经不单单是一个独立项目,系统与系统也需要通信和数据共享,而我们一般不会直接写Socket来通信,在.NETWCF无疑是个很好的选择。首先我们从需求导向来看待问题,假如系统A需要向系统B分享数据,那么这两个系统必定会先商量好分享哪些数据,这里就引出契约的概念,系统AB约定好要做什么事;这里A可以理解为Server端、BClient

A需要向外提供一个接口,该接口可以分享数据功能,怎么提供呢,一开始我们提到IIS时说到,服务器端就是要霸占一个端口,然后基于特定通信协议来通信,客户端就可以通过服务器的IP地址来与其通信了,WCF也是同样的道理。

说了上面一大堆废话,现在开始剖析示例程序。

HelloIndigo项目下面有个HelloIndigoService

 

View Code
namespace HelloIndigo
{

    [ServiceContract(Name
="HelloIndigoContract", Namespace="http://www.thatindigogirl.com/samples/2006/06", CallbackContract=typeof(IHelloIndigoServiceCallback))]
    
public interface IHelloIndigoService
    {
        [OperationContract]
//(IsOneWay=true)]
        void HelloIndigo(string message);
    }

    
public interface IHelloIndigoServiceCallback
    {
        [OperationContract]
//(IsOneWay=true)]
        void HelloIndigoCallback(string message);
   }


    [ServiceBehavior(ConcurrencyMode
=ConcurrencyMode.Reentrant)]
    
public class HelloIndigoService : IHelloIndigoService
    {
        
#region IHelloIndigoService Members

        
public void HelloIndigo(string message)
        {

            IHelloIndigoServiceCallback callback 
= OperationContext.Current.GetCallbackChannel<IHelloIndigoServiceCallback>();
            callback.HelloIndigoCallback(message);

        }
          
        
#endregion
    }

}

 

class HelloIndigoService 实现了 Public interface IHelloIndigoService

HelloIndigo里的代码是

IHelloIndigoServiceCallback callback = OperationContext.Current.GetCallbackChannel<IHelloIndigoServiceCallback>();

            callback.HelloIndigoCallback(message);

这里的意思客户端调我,那我也要调用客户端,HelloIndigoCallback就是客户也要提供的方法,这样实现了服务器被调用之后,可以根据需要处理完事情再调用客户端的方法。

以上就是服务器的代码,可是光是这样的代码,客户端是没办法使用的,HelloIndigoService还必须寄存在特定的应用程序中,就像前面提到过的IIS,寄存服务的方式很多,可以是IISWinformWindos Service.这个例子是寄存在命令行程序上,就是Host项目,代码很简单

using (ServiceHost host = new ServiceHost(typeof(HelloIndigo.HelloIndigoService)))

            {

                host.Open();

                Console.WriteLine("Press <ENTER> to terminate the host application");

                Console.ReadLine();

            }

就是把HelloIndigo项目下的HelloIndigoService类寄存起来,这样客户端程序就可以使用HelloIndigoService类提供的功能了,那么客户如何知道呢?那么我们来看一下Host项目的配置文件中的<system.serviceModel>吧,

    <baseAddresses>

<add baseAddress="http://localhost:8000"/>

<add baseAddress="net.tcp://localhost:9000"/>

</baseAddresses>

这就是对外公布其服务地址,我们再看一下Client项目的配置文件的<system.serviceModel>

http://localhost:8000/HelloIndigoService

客户端就是通过这样的的地址去寻找服务的,刚开始我们就这样照葫芦画瓢,来模仿,接下来再思考为什么这样去配置,计划这一篇的时间到了,先写到这,下篇继续补充。

posted @ 2011-07-28 14:03  赵一村  阅读(466)  评论(0)    收藏  举报