C# 删除MessageContract中的MessageBodyMember是否被视为破坏性更改?
考虑以下ServiceContract接口:C# 删除MessageContract中的MessageBodyMember是否被视为破坏性更改?,c#,wcf,messagecontract,C#,Wcf,Messagecontract,考虑以下ServiceContract接口: [ServiceContract] public interface ITest { [OperationContract] void MyMethod(MyClass obj); } 用MyClass Being: [MessageContract] public MyClass { [MessageBodyMember(Order = 0)] public int A { get; set; } [Me
[ServiceContract]
public interface ITest
{
[OperationContract]
void MyMethod(MyClass obj);
}
用MyClass Being:
[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文件,当客户端调用该方法时,客户端代码中会出现语法错误
order元素集,bodymember在通信中发送到服务器/客户端的位置。您可以在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客户机的限制性要大得多 在@naro的回答中添加: 对于以下框架来说,这是一个突破性的改变:
- .NET(C#,4.5)
- 爪哇8
这意味着即使在更新web服务定义之后,每个客户端仍然可以工作(不重新生成客户端)。谢谢!由于该类仅用于将数据从客户机发送到服务器,因此根据您的解释,即使未进行wsdl更新,客户机仍然可以使用该服务?如果使用对象“MyClient”将数据从客户机发送到服务器,则必须将该对象填充到客户机中。客户端不是将MessageBodyMember设置为“B”吗?当然,客户端仍将填充“B”并将其传递给服务器,客户端尚未更新wsdl。问题是:服务器是否能够处理这个问题并接受请求?当对象中有一个对象时会发生什么?是否可以将“顺序”属性用于其他内部属性?