【发布时间】:2016-11-25 03:32:51
【问题描述】:
我有一个现有的 WCF Web 服务,它使用类似的接口
[ServiceContract]
public interface IMyWebServices
{
[OperationContract]
bool MethodA();
[OperationContract]
bool MethodB();
}
然后是实现……
public class MyWebServices : IMyWebServices
{
public bool MethodA(){...}
public bool MethodB(){...}
}
我有一个客户端,在那里我生成了一个代理,一切都很好。
后来,这项服务的数量或操作会增加。所以通过实现,我将所有代码分解到其他类中,并将它们注入到主类中。
[ServiceContract]
public interface IMyWebServices : IServices1, IServices2
{
}
[ServiceContract]
public interface IServices1
{
[OperationContract]
bool MethodA();
}
[ServiceContract]
public interface IServices2
{
[OperationContract]
bool MethodB();
}
public class MyWebServices : IMyWebServices
{
private IServices1 _s1;
private IServices2 _s2;
public MyWebServices(IServices1, s1, IServices2, s2)
{
_s1 = s1;
_s2 = s2;
}
public bool MethodA()
{
return _s1.MethodA()
}
public bool MethodB()
{
return _s2.MethodB()
}
}
现在的问题是,如果部署了新服务,现有的已部署客户端(因此无需重新生成代理)现在将出现错误。事件虽然合同完全相同,但我得到了一个错误
...由于 EndpointDispatcher 的 ContractFilter 不匹配,无法在接收方处理。这可能是因为合约不匹配(发送方和接收方之间的操作不匹配)或发送方和接收方之间的绑定/安全不匹配。检查发送方和接收方是否具有相同的合同和相同的绑定(包括安全要求,例如消息、传输、无)。
因此,您似乎无法对服务器端接口进行任何重构。
有没有办法解决这个问题(用于未来的重构),或者这只是我们使用 WCF 必须忍受的事情(所以我们需要重新生成任何现有客户端的代理)?
【问题讨论】:
-
尝试查看代理重新生成前后自动生成的代码中的内容。
-
合约是接口