我有WCF服务。我在datacontract中更改了变量的名称,重建了服务但没有重建客户端
之前,这是客户的操作合同
[OperationContract(Name = "SubscribeWcfProvider")]
bool Subscribe(Guid subscriptionid);
之后,这是服务的运营合同
[OperationContract(Name = "SubscribeWcfProvider")]
bool Subscribe(Guid subscriberId);
现在,当客户端调用方法时,Guid始终为null。看来我无法更改变量名称?这是为什么?
更新
请告诉现场背后会发生什么?函数调用如何转换为消息?
答案 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等)。 )。