Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架。
WCF 的基本概念是以契约(Contract) 来定义双方沟通的协议,合约必须要以接口的方式来体现,而实际的服务代码必须要由这些合约接口派生并实现。
客户端调用服务端的数据,服务,操作,消息等信息时,双方都应提前制定好合约,以实现安全调用。若没有契约,则表明不予调用。
契约分成了四种:
数据契约(Data Contract):制定双方沟通时的数据格式。
服务契约(Service Contract),制定服务的定义。
操作契约(Operation Contract),制定服务提供的方法。
消息契约(Message Contract),制定在通信期间改写消息内容的规范。
如:操作契约:
[Operation Contract]
ITOO中:
namespace ITOO.ExamEvalQueryResult.Contract { [ServiceContract]//服务契约 public interface IQueryResultService { [OperationContract]//操作契约 string Test(); [OperationContract]//操作契约 List<AssessScore> QueryAssessScoreByPage(string strConditions, int pageSize, int pageIndex, out int total); }若在此段代码没有[OperationContract]这些契约,在客户端运行时就无法调用此方法。
由于 WCF 支持了HTTP,TCP,Named Pipe,MSMQ,Peer-To-Peer TCP 等协议,而 HTTP 又分为基本 HTTP 支持 (BasicHttpBinding) 以及 WS-HTTP 支持 (WsHttpBinding),而 TCP 亦支持 NetTcpBinding,NetPeerTcpBinding 等通信方式,因此,双方必须要统一通信的协议,并且也要在编码以及格式上要有所一致。
如:
<!--角色服务--> <endpoint address="http://192.168.22.242:7054/AuthorityRoleManageService.svc?wsdl" binding="wsHttpBinding" bindingConfiguration="WsHttpBinding_Default" contract="ITOO.AuthorityRoleManage.Contracts.IAuthorityRoleManageService" name="WsHttpBinding_Services" />
今天敲框架的时候遇到一个错误:
至少需要一个操作,那就是说IQueryResultService里没有写方法喽,打开一看,确实是空的,于是开始在IQueryResultService中添加方法,结果问题依旧没有解决。
通过一系列的查找、尝试,发现真正的原因其实是:没有写[Operation Contract],没有这个契约,及时这里有方法,也调不到啊......