2010-10-15 105 views
0

我有WCF服务。我已经改变了在datacontract变量的名称,重建服务,但没有重建客户服务合同和变量名称

之前,这是对客户

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

后承包经营合同,这是业务操作合同

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

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

UPDATE

请说出幕后发生了什么?函数调用如何转换为消息?

回答

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

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