删除 MessageContract 中的 MessageBodyMember 是否被视为重大更改?

Is removing a MessageBodyMember in a MessageContract considered a breaking change?

考虑以下服务合同接口:

[ServiceContract]
public interface ITest
{
    [OperationContract]
    void MyMethod(MyClass obj);
}

随着 MyClass 蜂鸣:

[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 会怎样?

如果客户端更新 WSDL 文件,当客户端调用该方法时,客户端代码中会出现语法错误。

设置正文发送到 server/client 的通信中的哪个位置的顺序元素。您可以在 svc 日志中看到它。例如:

<ns2: myClass xmlns:ns2="yourNamespace">
<A xmlns=""></A>
<B xmlns=""></B>
<C xmlns=""></C>
</ns2:myClass>

更改顺序元素后:

<ns2: myClass xmlns:ns2="yourNamespace">
<C xmlns=""></C>
<A xmlns=""></A>
<B xmlns=""></B>
</ns2: myClass >

我已经为你试过了这个例子。我使用了 WCF C# Web 服务和具有标准协议的 C# 客户端:BasicHttpBinding。我使用 WCF 测试客户端。在这种组合中,如果客户端没有进行 WSDL 更新,我在客户端中没有发现任何错误。在这种情况下,您可以无误地更改订单元素。但这不是正确的实现;因此你不能假设一切正常。对于其他客户端,看到的结果可能会有所不同。例如,Java 客户端的限制要多得多。

添加到@naro 的回答:

不是以下框架的重大更改:

  • .NET(C#,4.5)
  • Java 8

我没有测试任何其他东西,因为它对我们的场景无关紧要。

这意味着即使在更新 Web 服务定义之后,每个客户端仍然可以工作(无需重新生成客户端)。