我在WCF遇到一个让我发疯的问题。它是:
由于EndpointDispatcher上的ContractFilter不匹配,无法在接收方处理带有Action'GetUserByUserNameAndPassword'的消息。这可能是由于合同不匹配(发送方与接收方之间的操作不匹配)或发送方与接收方之间的绑定/安全性不匹配。检查发件人和收件人是否具有相同的合同和相同的约束(包括安全要求,例如邮件,传输,无)。
设置如下。我有一个在IIS 7中运行客户端网站的Web服务器,它试图使用WCF与另一台在IIS 7中具有SQL Server和托管WCF服务的服务器进行通信。
这两台机器都在同一个域中。
尝试将其删除至零,我试图让它在没有安全性的情况下工作。客户端配置如下所示:
<bindings>
<wsHttpBinding>
<binding name="wsHttpBinding_Normal">
<security mode="None"/>
</binding>
</wsHttpBinding>
</bindings>
<client>
<endpoint address="http://192.168.1.10:3026/DS.Service/AuditLogger.svc"
binding="wsHttpBinding" bindingConfiguration="wsHttpBinding_Normal"
contract="AuditLogger.IAuditLogger" name="wsHttpBinding_IAuditLogger">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
</client>
然后在服务器上,配置如下所示:
<bindings>
<wsHttpBinding>
<binding name="NormalTrafficBinding">
<security mode="None"/>
</binding>
</wsHttpBinding>
</bindings>
<services>
<service name="DS.Service.ServiceImplementation.AuditLogger">
<endpoint address="http://192.168.1.10:3026/DS.Service/AuditLogger.svc"
binding="wsHttpBinding" bindingConfiguration="NormalTrafficBinding"
contract="DS.Service.ServiceContracts.IAuditLogger">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
</service>
<services>
方法本身如下:
[OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, AsyncPattern = false, Action = "GetUserByUserNameAndPassword")]
[FaultContract(typeof(DS.Service.FaultContracts.DSOfficeFault))]
System.Data.DataSet GetUserByUserNameAndPassword(string userName, string password);
答案 0 :(得分:1)
您必须在两端(服务器和客户端)定义相同的合同。尽管它们都被称为IAuditLogger,但它们可能具有不同的签名。尝试只将一个IAuditLogger类放在一个单独的程序集中,然后在两个配置文件中引用它,或确保两个IAuditLogger具有相同的方法。
你可以拥有类似的东西:
<client>
<endpoint address="http://192.168.1.10:3026/DS.Service/AuditLogger.svc"
binding="wsHttpBinding" bindingConfiguration="wsHttpBinding_Normal"
contract="AuditLogger.IAuditLogger" name="wsHttpBinding_IAuditLogger">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
和
<services>
<service name="DS.Service.ServiceImplementation.AuditLogger">
<endpoint address="http://192.168.1.10:3026/DS.Service/AuditLogger.svc"
binding="wsHttpBinding" bindingConfiguration="NormalTrafficBinding"
contract="AuditLogger.IAuditLogger">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
</service>