1.调用方法实现时,必须实现原有接口。必须使用[ServiceContract]进行修饰,否则在客户端无法调用该方法。
using System.ServiceModel;
namespace WCFService
{
[ServiceContract]
public interface IUser
{
[OperationContract]
string ShowName(string name);
}
}
namespace WCFService
{
public class User : IUser
{
public string ShowName(string name)
{
string wcfName = string.Format("WCF服务,显示姓名:{0}", name);
return wcfName;
}
}
}
2.大部分方法都是等待WCF服务端方法运行过后才运行客户端方法。加[OperationControact(IsOneWay=true)],方法中不可有参数回传,使用void调用,则可以实现单向调用。
3.双工服务调用
wcf服务接口定义
namespace WcfServiceLibrary2
{ [ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples",SessionModel=Session.Required,CallbackContract=type(iCalcalatorDeplexCallback))]
public interfact iCalcalatorDuplex
{
[OperationContract(IsOneWay=true)]
voide clear();
[OperationContract(IsOneWay=true)]
void AddTo(double n);
[OperationContract(IsOneWay=true)]
void SubtractFrom(double n);
[OperationContract(IsOneWay=true)]
void MultiplyBy(double n);
[OperationContract(IsOneWay=true)]
void DivideBy(double n);
}
public interfact iCalculatorDuplexCallback
{
[OperationContract(IsOneWay=true)]
void Equals(double result);
[OperationContract(IsOneWay=true)]
void Equation(string eqn);
}
}
wcf实现类
namespace WcfServiceLibrary2
{
[ServiceBehavior(instanceContextMode=InstanceContextMode.PerSession)]
public class CalcalatorService:ICalculatorDuplex
{
double result;
string equation;
iCalculatorDuplexCallback callback=null;
public CalcalatorService()
{
result=0.00;
equation-result.ToString();
callback=OperationContext.Current.GetCallbackChannel<iCalculatorDuplexCallback>();
}
public void Add(double n)
{
result += n;
equation += " + " + n.ToString();
callback.eQuals(result);
}
}
}
wcf配置文件中,<endpoint address="" binding="HttpBinding" contract="WcfServiceLibrary2.IService1">更新为<endpoint address="" binding="wsDualHttpBinding" contract="WcfServiceLibrary2.IService1">
因为默认的不支持回调。
wcf客户端
using ConsoleApplication1.ServiceReferencel;
namespace ConsoleApplication1
{
public class CallbackHandler:iCalcalatorDuplexCallback
{
public void Equals(double result)
{
controle.writeline("Result({0})",result);
}
public void Equation(string eqn)
{
controle.writeline("Equation({0})",eqn);
}
}
class Program
{
static void Main(string{} args)
{
InstanceContext instanceContext=new InstanceContext(New CallbackHandler());
serviceREferencel.CalculatorDuplexClient client=new serviceREferencel.CalculatorDuplexClient(instanceContext);
cllient.Add(100);
}
}
}
Wcf配置文件
<System.ServiceModel>
<services>----服务和终结点
<service>
<endpoint/>
</service>
</services>
<bindings>-----绑定(可选)
<binding>
</binding>
</bindings>
<behaviors>-----行为(可选)
<behavior>
</behavior>
</behaviors>
</System.ServiceModel>
【Service】元素,每个都具有以下属性
name,指定提供服务协定的实现的类型。这是完全限定名称(命名空间和类型名称)
behaviorConfiguration,指定一个在behaviors元素中找到的behavior元素的名称,指定的行为控制操作,例如服务是否允许模拟。
【endpoint】元素,每个节点都需要以下属性表示的地址、绑定和协定
address,指定服务的统一资源标识符(URI),它可以是一个绝对地址,或是一个相对于服务基址给定的地址。如果设置为空字符串,则指定示在创建服务的ServiceHost时,终结点在指定的基址上可用。
binding,通常,指定一个类似WsHttpBinding的系统提供的绑定,但也可以指定一个用户定义的绑定,指定的绑定确定传输协议类型、安全和使用的编码,以及是否支持或启用可靠会话、事务或流。
bindingConfiguration,如果必须修改绑定的默认值,则可通过在bindings放弃各学科配置相应的binding元素来执行此操作。此属性应赋予与用于更改默认值的binding元素的name属性相同的值。
contract,指定定义协定的接口。这是由Service元素的name属性指定的公共语言运行库(CLR)类型中实现的接口。
【binding】元素,
【behaviors】元素
<behaviors>
</behaviors>