删除MessageContract中的MessageBodyMember是否被认为是破坏性的更改

本文关键字:破坏性 认为是 MessageContract 中的 MessageBodyMember 是否 删除 | 更新日期: 2023-09-27 18:10:41

考虑以下serviceconcontract - interface:

[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-Service的客户端是否需要进行额外的更改以使用新的服务定义?

另外,如果我将C额外更改为新的Order = 1,将会发生什么?

删除MessageContract中的MessageBodyMember是否被认为是破坏性的更改

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

order元素设置bodymember发送到服务器/客户端的通信位置。您可以在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更新,客户机中就不会出现错误。在这种情况下,您可以更改order元素而不会出现错误。但这不是一个正确的实现;因此,你不能假设一切正常。对于其他客户端,结果可能会有所不同。例如,Java客户机的限制要严格得多。

添加到@naro的答案:

不是对于以下框架来说是一个突破性的改变:

  • 。Net (c#, 4.5)
  • Java 8

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

这意味着即使在更新了web服务定义之后,每个客户端仍然工作(不重新生成客户端)。