2012-10-16 103 views
0

我有一個圖書館,我需要生成客戶端代理類,並運行此命令,並在我的本地盒服務時的現有代碼工作正常WCF客戶端代理生成新的方法除了沒有

svcutil.exe /config:thn /r:Citi.Rbcs.BusGn.dll /r:Citi.Rbcs.Buscm.dll net.tcp://localhost:8088/RbcThnService/mex 

的客戶端代理生成正常。 RbcThnService使用接口IRbcThinService。如果我再添加一個新的方法到界面如下

[OperationContract(ProtectionLevel = ProtectionLevel.EncryptAndSign)] 
     [FaultContract(typeof (GenericException))] 
     [FaultContract(typeof (CustomException))] 
     RbcCustomerStructure GetCustomerStructures(string CustomerId, short QueueId, DateTime dateUpdate, RbcSecurityContext securityContext); 

然後重建和安裝服務,並嘗試重新生成客戶端代理,我得到

There is an error in the XML document. 

The value for the 'type' attribute is invalid - 'q32:ArrayOfstring' is an invalid value for the 'type' attribute. 

這聽起來像它沒有找到一個聲明中的某種類型,但奇怪的是,接口中有另一種方法,在原始庫中有完全相同的簽名,這使得客戶端代理生成得很好。所以我只是用一個新名字創建一個完全相同的方法。

有沒有人有任何建議?

更新:好的情節變厚了,如果我註釋掉現有的方法之一,然後重試 - 它適用於新的方法。我試圖將其剝離到只有少數方法加上新的方法,它的工作原理。我逐漸地重新引入了其他方法,並且一直在繼續工作,直到我添加了最後一個,然後它出錯了。有趣的是,我得到了一個原始方法註釋掉,它工作,然後我創建了一個第二個虛擬新方法,它錯了,相同的錯誤,但不是ArrayOfstring它有一個不同的類型,因爲它失敗了,因爲的。

因此,如果我沒有吠叫錯誤的樹,它似乎與我在接口定義中擁有的方法數量或生成的XML的潛在長度有關。我應該知道有什麼限制嗎?

回答

0

對於任何類型的Web服務,都不能有重載的方法。如果您指定不同的OperationContract名稱E.G,WCF將允許此操作。

[ServiceContract] 
interface IService 
{ 
    [OperationContract(Name="Foo")] 
    void Foo(); 

    [OperationContract(Name="Foobar")] 
    void Foo(string bar); 

} 

但是這基本上改變了公衆簽名的方法,即使它被命名的接口是相同的,所以我一般只是沒有做到這一點,因爲在創建客戶端時,它可以更混亂。

檢查出this post類似的問題。在Web服務(包括WCF)中,任何重載(同名)的方法都不可能找出你所調用的內容。將OperationContract中的方法名稱或Name屬性更改爲不同的內容,然後重試。