服务合同和变量名称

时间:2010-10-15 16:44:28

标签: .net wcf datacontractserializer

我有WCF服务。我在datacontract中更改了变量的名称,重建了服务但没有重建客户端

之前,这是客户的操作合同

[OperationContract(Name = "SubscribeWcfProvider")]
bool Subscribe(Guid subscriptionid);

之后,这是服务的运营合同

[OperationContract(Name = "SubscribeWcfProvider")]
bool Subscribe(Guid subscriberId);

现在,当客户端调用方法时,Guid始终为null。看来我无法更改变量名称?这是为什么?

更新

请告诉现场背后会发生什么?函数调用如何转换为消息?

2 个答案:

答案 0 :(得分:4)

您生成的代理(很可能)在更改之前创建,而不是在其之后重新生成。所以代理“硬编码”了基于WSDL的参数(我假设你使用SOAP)。以下是SOAP消息的示例(取自this site)。

<?xml version='1.0'?>
<SOAP:Envelope
  xmlns:SOAP='urn:schemas-xmlsoap-org:soap.v1'>
 <SOAP:Body>
  <i:getBalance
    xmlns:i='urn:develop-com:IBank'>
   <account>23619-22A</account>
  </i:getBalance>
 </SOAP:Body>
</SOAP:Envelope>

在这种情况下,getBalance方法需要account参数。如果这在服务器端发生更改并且客户端未获得新合同并重建代理,则无法发送正确的参数。

请注意,如果您需要在不违反合同的情况下在代码中进行类似这些更改,您可以通过以下方式对参数应用MessageParameterAttribute:

[OperationContract(Name = "SubscribeWcfProvider")]
bool Subscribe([MessageParameter(Name = "subscriptionid")]Guid subscriberId);

MSDN上有一个很好的示例,它显示了您需要编辑的代码以及将要发送的消息。

我建议您查看服务生成的WSDL,以便了解幕后发生的事情。

答案 1 :(得分:1)

这取决于您的序列化选择。通常,如果参数的名称出现在序列化消息中,那么如果您在服务而不是客户端更改其名称,它将无法正确转换 - 而且几乎总是如此(SOAP,XML,JSON等)。 )。