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

 

 

posted on 2013-12-01 17:08  peter.peng  阅读(238)  评论(0编辑  收藏  举报