wcf 单工通讯

介绍 双工通讯

我们知道web程序和服务器交互的经典模式就是一问一答,就是客户端向服务器发一个请求,然后等待请求的结果,客户端一直要等到接收到结果,才会继续执 行。如果某个请求的计算需要比较长的时候,我们的页面就会假死状态,直到完全接收到结果。这个就是经典的”请求/应答模式”。

WCF中, 默认情况下也是这种交互模式,但除了” 请求/应答”这种经典模式外,还有”单工操作”和”双工操作”两种模式,下面我们就简单地介绍一下WCF中这三个 模式中的”单工操作”,再下一节演示”双工操作”,因为我自己也是初学者,所以示例会比较的简单,一为介绍,二为自己多熟练:

单向操作
这 种情况下,客户端不关心服务器是不是执行请求成功,也不会往客户端回发消息。所以想要实现这种操作的方法必须没有返回值,也就是返回值必须是void的方 法,同样,服务器抛出的异常也不会传递到客户端。这种操作的好处就是,客户端发送请求后会马上继续执行后面的代码,不会停顿下来等待。

下面我们做一个简单的示例来演示一下单向操作:
先定一个契约:

[ServiceContract]
public interface IOperate
{
    [OperationContract]
    void MyMethod();
}

这个契约中方法MyMethod没有标识为单向操作,那么它的交互模式就是”请求/应答”模式。
下面定义服务,实现这个契约:

public class Operate : IOperate
{
    public void MyMethod()
    {
        Console.WriteLine("我被执行了,我要阻塞5秒钟!");
        Thread.Sleep(5000);
    }
}

 

服务中的MyMethod使线程挂起5秒。

然后是创建服务,为控制台程序:

class Program
{
    static void Main(string[] args)
    {
        NetTcpBinding binding = new NetTcpBinding();
        using (ServiceHost host = new ServiceHost(typeof(Operate)))
        {
            host.AddServiceEndpoint(typeof(IOperate), binding, "net.tcp://localhost:8001");
            host.Opened += delegate
            {
                Console.WriteLine("wcf服务开启!");
            };
            host.Open();

            Console.ReadLine();
        }
    }
}

 

接下面我们创建客户端(也是控制台程序)调用这个服务,因为是演示,所以使用简单的以编程的方式调用该服务:

class Program
{
    static void Main(string[] args)
    {
        NetTcpBinding bind = new NetTcpBinding();
        EndpointAddress address=new EndpointAddress("net.tcp://localhost:8001");

        ChannelFactory<wcfservice.IOperate > clientfac = new ChannelFactory<wcfservice.IOperate >(bind, address);
        clientfac.Open();
        wcfservice.IOperate clientproxy = clientfac.CreateChannel();
        Console.WriteLine("将要执行wcf服务:" + DateTime.Now);
        clientproxy.MyMethod();
        Console.WriteLine("wcf服务执行完了:" + DateTime.Now);
        clientfac.Close();
        Console.ReadLine();
    }
}

 

接下来我们就是看看演示的效果了,先运行服务,运行窗口如下:

 

 然后我们运行客户端,运行窗口如下:

 

从上面的运行结果看,客户端被阻塞了5秒钟,这是因为经典的” 请求/应答”模式客户端需要等待服务器的结果才会执行下面的代码。

下面我们将契约修改如下:

[ServiceContract]
public interface IOperate
{
    [OperationContract(IsOneWay = true)]
    void MyMethod();
}

注意:IsOneWay = true就标识了方式MyMethod为单向操作,不需要其它任何额外的代码就能实现单向操作了。示例中的其它代码都不变化,现在看看单向操作的效果。

还是先运行服务,运行窗口如下,和图1是一样的,没有任何区别:

 

再运行客户端,运行窗口如下:

 

注意看客户端 时间显示结果 一模一样。

这上面的运行可以看到,客户端在调用服务中MyMethod()方法后立刻执行了后面的代码,并没有等待5秒,这个就是单向操作的效果了。

 

参考文献:http://www.lmwlove.com/ac/ID1031

 

“有来无往来” 这个模式叫 单工

 

源码下载

posted on 2015-01-14 14:55  广交天下好友  阅读(571)  评论(0编辑  收藏  举报

导航