考虑以下ServiceContract-Interface:
[ServiceContract]
public interface ITest
{
[OperationContract]
void MyMethod(MyClass obj);
}
使用MyClass beeing:
[MessageContract]
public MyClass
{
[MessageBodyMember(Order = 0)]
public int A { get; set; }
[MessageBodyMember(Order = 1)]
public int B { get; set; }
[MessageBodyMember(Order = 2)]
public int C { get; set; }
}
MyClass
现在更改为如下所示:
[MessageContract]
public MyClass
{
[MessageBodyMember(Order = 0)]
public int A { get; set; }
[MessageBodyMember(Order = 2)]
public int C { get; set; }
}
使用此WCF服务的客户端是否需要进行其他更改才能使用新服务定义?
另外,如果我要另外更改C
以获得新的Order = 1
会怎样?
答案 0 :(得分:2)
如果客户端更新了WSDL文件,当客户端调用该方法时,它会在客户端的代码中出现语法错误。
订单元素设置在主体成员发送到服务器/客户端的通信中的位置。你可以在svc日志中看到它。例如:
<ns2: myClass xmlns:ns2="yourNamespace">
<A xmlns=""></A>
<B xmlns=""></B>
<C xmlns=""></C>
</ns2:myClass>
更改了ordner元素后:
<ns2: myClass xmlns:ns2="yourNamespace">
<C xmlns=""></C>
<A xmlns=""></A>
<B xmlns=""></B>
</ns2: myClass >
我为你试过这个例子。我使用了WCF C#Web服务和带有标准协议的C#客户端:BasicHttpBinding。我使用WCF测试客户端。在这种组合中,我在客户端没有错误,前提是客户端没有进行WSDL更新。在这种情况下,您可以无错误地更改order元素。但这不是一个正确的实施;因此你不能假设一切正常。对于其他客户,请看结果可能不同。例如,Java客户端限制性更强。
答案 1 :(得分:0)
添加到@ naro的答案:
不以下框架的重大变化:
我没有测试任何其他内容,因为它对我们的场景并不重要。
这意味着即使在更新Web服务定义之后,每个客户端仍然可以工作(不重新生成客户端)。