在MessageContract中删除MessageBodyMember是否被视为重大变化?

时间:2015-08-31 09:14:33

标签: c# wcf messagecontract

考虑以下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会怎样?

2 个答案:

答案 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的答案:

以下框架的重大变化:

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

我没有测试任何其他内容,因为它对我们的场景并不重要。

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