[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
两接口类
//指定会话模式:必需的,另一个指向回调后的契约(接口)
[ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(IServiceDuplexCallBack))]
public interface IService1
{
[OperationContract(IsOneWay = true)]
void AddNumber(int value, int value1); [OperationContract(IsOneWay = true)]
void SubstractNumber(int x, int y);
} public interface IServiceDuplexCallBack//回调契约
{
[OperationContract(IsOneWay = true)]
void Calculate(int result);
}
实现服务端接口类
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]//指定行为模式,为每个会话开启一个新的对象
public class Service1 : IService1
{
IServiceDuplexCallBack callback//声明回调对象
{
get
{
return
OperationContext.Current.GetCallbackChannel<IServiceDuplexCallBack>();//
}
} public void AddNumber(int value, int value1)
{
int z = value + value1;
callback.Calculate(z);//通过回调对象把结果发回到客户端
} public void SubstractNumber(int x, int y)
{
int z = x - y;
callback.Calculate(z);//通过回调对象把结果发回到客户端
}
配置文件
<system.serviceModel>
<services>
<service name="HCC.WCF.Double.Model.Service1">
<host>
<baseAddresses>
<add baseAddress = "http://localhost:8732/Design_Time_Addresses/HCC.WCF.Double.Model/Service1/" />
</baseAddresses>
</host>
<!-- Service Endpoints -->
<!-- 除非完全限定,否则地址将与上面提供的基址相关 -->
<endpoint address ="" binding="wsDualHttpBinding" contract="HCC.WCF.Double.Model.IService1">
<!--
部署时,应删除或替换下列标识元素,以反映
用来运行所部署服务的标识。删除之后,WCF 将
自动推断相应标识。
-->
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<!-- Metadata Endpoints -->
<!-- 元数据交换终结点供相应的服务用于向客户端做自我介绍。 -->
<!-- 此终结点不使用安全绑定,应在部署前确保其安全或将其删除-->
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<!-- 为避免泄漏元数据信息,
请在部署前将以下值设置为 false 并删除上面的元数据终结点 -->
<serviceMetadata httpGetEnabled="True"/>
<!-- 要接收故障异常详细信息以进行调试,
请将以下值设置为 true。在部署前设置为 false
以避免泄漏异常信息-->
<serviceDebug includeExceptionDetailInFaults="False" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
前台代码:必须实现一个回调接口
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
/// <summary>
/// 双工通信
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button3_Click(object sender, EventArgs e)
{
InstanceContext ic=new InstanceContext(new CallBackHandler());
WCF.DoubleModel.Service1Client _client = new WCF.DoubleModel.Service1Client(ic);
_client.AddNumber(, );
_client.Close();
}
} public class CallBackHandler : WCF.DoubleModel.IService1Callback//前台实现回调接口
{
public void Calculate(int result)
{
MessageBox.Show(result.ToString());
}
}