zoukankan      html  css  js  c++  java
  • 一: WCF的服务端与客户端在通信时有三种模式:请求响应模式、数据报模式和双工通讯模式。

    说一下基本知识,

        1、如果想要将当前接口作为wcf服务器,则一定要加上[ServiceContract] 契约

             2、要想将方法作为wcf服务方法发布给外部调用,则一定要加上    [OperationContract]契约

             3、实体类作为wcf方法参数或者返回值的话,则要贴上 [DataContract]

             4、只有贴上了[DataMember]的属性才能作为wcf服务器方法参数值类传递,否则第三方调用者看不到此属性

    二:请求响应模式:当客户端发出请求以后,一定要等待wcf服务的方法处理完成后才会响应给客户端,此过程中,客户端处于等待过程。如果服务端在处理大数据,很长的逻辑,执行耗时长,就不建议使用这种模式了。

    实例:

    复制代码
     1 //服务端接口:
     2 
     3   [ServiceContract]
     4 
     5     public interface IWcfService
     6 
     7     {
     8 
     9         [OperationContract]
    10 
    11         string GetData(int value, int value2);
    12 
    13     }
    14 
    15 //服务端实现
    16 
    17   public class WcfService : IWcfService
    18 
    19     {
    20 
    21         public string GetData(int value,int value2)
    22 
    23         {
    24 
    25             Thread.Sleep(10000);
    26 
    27             return string.Format("你输入的是: {0}", value + value2);
    28 
    29         }
    30 
    31     }
    32 
    33 下面我们用一个控制台程序托管WCF服务(也可以用windows服务托管等)
    34 
    35 class StartService
    36 
    37     {
    38 
    39         static void Main()
    40 
    41         {
    42 
    43             using (ServiceHost host = new ServiceHost(typeof(WcfServiceLibrary.WcfService)))
    44 
    45             {
    46 
    47                 host.Open();
    48 
    49                 Console.WriteLine("Wcf服务已启动,输入stop命令,停止服务!");
    50 
    51                 while (!Console.ReadLine().Equals("stop"))
    52 
    53                 {
    54 
    55                     Console.WriteLine("停止服务命令不正确!输入stop命令,停止服务!");
    56 
    57                 }
    58 
    59                 host.Close();
    60 
    61                 Console.WriteLine("Wcf服务已停止!!!");
    62 
    63             }
    64 
    65             Console.ReadKey();
    66 
    67         }
    68 
    69 }
    70 
    71 //客户端调用(这里就用WinForm来测试)
    72 
    73      WcfServiceClient client = new WcfServiceClient();
    74 
    75       MessageBox.Show(client.GetData(10, 15));
    76 
    77       client.Close();
    复制代码

    上面我们让服务端线程挂起10秒,这个时候客户端只有等待10秒才能接收处理结果

    三:数据报模式

    要点:1.方法不能用返回值

         2.在方法契约上加上[OperationContract(IsOneWay=true)]

      数据报方法做的业务一般都是比较耗时的,一般分为如下类型:

         1、长时间的数据库操作 ,比如海量表的拆分操作

         2、长时间的IO操作,比如长时间的文件保存

    实例

    复制代码
     1 //服务器端接口:
     2 
     3 [ServiceContract]
     4 
     5     public interface IServiceForOneWay
     6 
     7     {
     8 
     9         [OperationContract(IsOneWay=true)]
    10 
    11         void GetData(int value);
    12 
    13     }
    14 
    15 //服务器端实现:
    16 
    17 public class ServiceForOneWay : IServiceForOneWay
    18 
    19     {
    20 
    21         public void GetData(int value)
    22 
    23         {
    24 
    25             Thread.Sleep(5000);
    26 
    27             string v = value.ToString();
    28 
    29         }
    30 
    31     }
    32 
    33 //客户端调用(同上,我们用Winform测试)
    34 
    35   ServiceForOneWayClient OneWayClient = new ServiceForOneWayClient();
    36 
    37     OneWayClient.GetData(10);
    38 
    39     MessageBox.Show("调用完毕");
    复制代码

    上例中:只要调用GetData方法,调用完毕会马上显示,因为是单向的数据报模式,从方法契约的命名参数IsOneWay=true我们就知道意思了。单向为true。但这样客户端就不知道服务器处理结果。

    四:双工通讯模式

    双工通讯wcf服务特点:

    1、双工方法的返回值为void

    2、方法必须为数据报方法

    3、服务契约必须强制开启Session同时指定回调接口类型

    4、配置文件中必须在终结点中指定绑定模式为双工通信模式,

    支持回调的绑定有4种:WSDualHttpBinding、NetTcpBinding、NetNamedPipeBinding、NetPeerTcpBinding。我们这里用wsDualHttpBinding为例

    实例:

    复制代码
     1 //服务器端接口
     2 
     3     [ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(IResult))]
     4 
     5     public interface IServiceForwsDual
     6 
     7     {
     8 
     9         [OperationContract(IsOneWay = true)]
    10 
    11         void GetData(string value);
    12 
    13     }
    14 
    15     /// <summary>
    16 
    17     /// 回调接口,会被客户端的子类来实现
    18 
    19     /// </summary>
    20 
    21     public interface IResult
    22 
    23     {
    24 
    25         [OperationContract(IsOneWay = true)]
    26 
    27         void DispalyResult(string result);
    28 
    29 }
    30 
    31 //服务器端实现:
    32 
    33 /// <summary>
    34 
    35     /// 在ServiceForwsDual构造函数中得到当前请求客户端的回调实例对象
    36 
    37     /// </summary>
    38 
    39     public class ServiceForwsDual : IServiceForwsDual
    40 
    41     {
    42 
    43         IResult result=null;
    44 
    45         public ServiceForwsDual()
    46 
    47         {
    48 
    49             //获取当前客户端请求上下文中的回调接口具体实现类的对象
    50 
    51             result = System.ServiceModel.OperationContext.Current.GetCallbackChannel<IResult>();
    52 
    53         }
    54 
    55         public void GetData(string value)
    56 
    57         {
    58 
    59             System.Threading.Thread.Sleep(5000);
    60 
    61  
    62 
    63             result.DispalyResult("我是服务器,我处理完成了!");
    64 
    65         }
    66 
    67     }
    68 
    69 //客户端调用:
    70 
    71 //在代理客户端的构造函数中,传入第2步实现的回调接口的具体类对象
    72 
    73   ServiceForwsDualClient wsDualClient = new ServiceForwsDualClient(new System.ServiceModel.InstanceContext(new DwsDualResult()));
    74 
    75     wsDualClient.GetData("哈哈");
    76 
    77     MessageBox.Show("我是客户端,我处理完成了");
    复制代码

    上例中:客户端调用后,会在5秒后再次‘alert‘出我是服务器,我处理完成了!

    上面例子都是利用线程的挂起来模拟大数据,复杂耗时的逻辑处理。

    五:源码下载:WCFStudy

  • 相关阅读:
    数学之矩阵快速幂
    数学篇之高斯消元
    P1033自由落体
    P1258小车问题
    P1072Hankson的趣味题
    P2837晚餐队列安排
    P3811 乘法逆元
    P1002过河卒
    P1507 NASA的食物计划
    P1079 Vigenère 密码
  • 原文地址:https://www.cnblogs.com/weihengblogs/p/8671030.html
Copyright © 2011-2022 走看看