zoukankan      html  css  js  c++  java
  • WCF的通信

       [ServiceContract]
        public interface IContractDemoOne
        {
            [OperationContract(IsOneWay=true)]//单工通信:向服务器发信息,没有返回信息:一般只能void且没有out才能使用,像有返回值,update时不能使用。
                                              //优点就是快,不用等待,客户端可以进行其它的操作
                                              //最大的缺点:不知道有没有成功。
            string GetDataTable();


            [OperationContract]//默认:请求/响应模式
            void InsertIntoDataToTable();
        }

        双工模式

        [ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(IServiceDuplexCallBack))]
        public interface IDoubleContractModel
        {
            [OperationContract(IsOneWay=true)]//双工模式:客户端可以向服务端发送信息,同时服务器也可以发送信息到客户端.
            void AddNumber();
        }
        public interface IServiceDuplexCallBack
        {
            [OperationContract(IsOneWay=true)]
            void Calculate(double result);
        }

       demo1

    两接口类

     1  //指定会话模式:必需的,另一个指向回调后的契约(接口)
     2     [ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(IServiceDuplexCallBack))]
     3     public interface IService1
     4     {
     5         [OperationContract(IsOneWay = true)]
     6         void AddNumber(int value, int value1);
     7 
     8         [OperationContract(IsOneWay = true)]
     9         void SubstractNumber(int x, int y);
    10     }
    11 
    12     public interface IServiceDuplexCallBack//回调契约
    13     {
    14         [OperationContract(IsOneWay = true)]
    15         void Calculate(int result);
    16     }
    View Code

     实现服务端接口类

     1 [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]//指定行为模式,为每个会话开启一个新的对象
     2     public class Service1 : IService1
     3     {
     4         IServiceDuplexCallBack callback//声明回调对象
     5         {
     6             get
     7             {
     8                 return
     9                 OperationContext.Current.GetCallbackChannel<IServiceDuplexCallBack>();//
    10             }
    11         }
    12 
    13         public void AddNumber(int value, int value1)
    14         {
    15             int z = value + value1;
    16             callback.Calculate(z);//通过回调对象把结果发回到客户端
    17         }
    18 
    19         public void SubstractNumber(int x, int y)
    20         {
    21             int z = x - y;
    22             callback.Calculate(z);//通过回调对象把结果发回到客户端
    23         }
    View Code

    配置文件

     1 <system.serviceModel>
     2     <services>
     3       <service name="HCC.WCF.Double.Model.Service1">
     4         <host>
     5           <baseAddresses>
     6             <add baseAddress = "http://localhost:8732/Design_Time_Addresses/HCC.WCF.Double.Model/Service1/" />
     7           </baseAddresses>
     8         </host>
     9         <!-- Service Endpoints -->
    10         <!-- 除非完全限定,否则地址将与上面提供的基址相关 -->
    11         <endpoint address ="" binding="wsDualHttpBinding" contract="HCC.WCF.Double.Model.IService1">
    12           <!-- 
    13               部署时,应删除或替换下列标识元素,以反映
    14              用来运行所部署服务的标识。删除之后,WCF 将
    15               自动推断相应标识。
    16           -->
    17           <identity>
    18             <dns value="localhost"/>
    19           </identity>
    20         </endpoint>
    21         <!-- Metadata Endpoints -->
    22         <!-- 元数据交换终结点供相应的服务用于向客户端做自我介绍。 --> 
    23         <!-- 此终结点不使用安全绑定,应在部署前确保其安全或将其删除-->
    24         <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
    25       </service>
    26     </services>
    27     <behaviors>
    28       <serviceBehaviors>
    29         <behavior>
    30           <!-- 为避免泄漏元数据信息,
    31           请在部署前将以下值设置为 false 并删除上面的元数据终结点  -->
    32           <serviceMetadata httpGetEnabled="True"/>
    33           <!-- 要接收故障异常详细信息以进行调试,
    34           请将以下值设置为 true。在部署前设置为 false 
    35             以避免泄漏异常信息-->
    36           <serviceDebug includeExceptionDetailInFaults="False" />
    37         </behavior>
    38       </serviceBehaviors>
    39     </behaviors>
    40   </system.serviceModel>
    View Code

    前台代码:必须实现一个回调接口

     1 public partial class Form1 : Form
     2     {
     3         public Form1()
     4         {
     5             InitializeComponent();
     6         }
     7         /// <summary>
     8         /// 双工通信
     9         /// </summary>
    10         /// <param name="sender"></param>
    11         /// <param name="e"></param>
    12         private void button3_Click(object sender, EventArgs e)
    13         {
    14             InstanceContext ic=new InstanceContext(new CallBackHandler());
    15             WCF.DoubleModel.Service1Client _client = new WCF.DoubleModel.Service1Client(ic);
    16             _client.AddNumber(3, 4);
    17             _client.Close();
    18         }
    19     }
    20 
    21     public class CallBackHandler : WCF.DoubleModel.IService1Callback//前台实现回调接口
    22     {
    23         public void Calculate(int result)
    24         {
    25             MessageBox.Show(result.ToString());
    26         }
    27     }
    View Code
  • 相关阅读:
    ExtJS 刷新或者重载Tree后,默认选中刷新前最后一次选中的节点代码片段
    ios>APP名称的多语言化(转)
    android>apk破解以及重新编译(转)
    MFC动态库基本概念
    (内存中的)堆和栈的区别(转过无数次的文章)
    面向对象五大基本原则
    VS20052008程序发布、打包(MFC)
    在MFC中创建动态控件的生成与响应
    SQL2000自动备份数据库并发送邮件报告数据库自动备份情况
    The Concept of Callbacks
  • 原文地址:https://www.cnblogs.com/peter-peng/p/3452756.html
Copyright © 2011-2022 走看看