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 }
实现服务端接口类
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 }
配置文件
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>
前台代码:必须实现一个回调接口
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 }
posted on 2013-12-01 17:08 peter.peng 阅读(238) 评论(0) 编辑 收藏 举报