2010-10-15 50 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等)。 )。