服務引用不生成客戶端類型
我正在嘗試通過向其添加服務引用來使用類庫中的 WCF 服務。在其中一個類庫中,它被正確使用,我可以訪問客戶端類型以生成代理。然而,在我的第二個類庫中(甚至在控制台測試應用程序中),當我添加相同的服務引用時,它隻公開了合同操作中涉及的類型,而不是我生成代理的客戶端類型。
例如,Endpoint 暴露了 2 個服務 - ISvc1 和 ISvc2。當我在第一個類庫中添加對此端點的服務引用時,我得到 ISvc1Client 和 f ISvc2Client 來生成代理,以便使用通過這兩個合同公開的操作。除了這些客戶端之外,服務引用還公開了操作中涉及的類型(類型 1、類型 2 等),這就是我需要的。但是,當我嘗試在另一個控制台應用程序或類庫中添加對相同端點的服務引用時,只有 Type 1、Type 2 等被暴露,而不是 ISvc1Client 和 ISvc2Client,因為我無法生成代理來訪問我需要的操作。我無法確定為什麼在一個類庫中正確生成了服務引用,但在另一個類庫或測試控制台應用程序中卻沒有。
顯然,在添加服務引用之前,您必須在項目中添加對 System.Web 的引用。做到了。
您可能選擇
Reuse types in specified reference assemblies了但沒有選擇非常重要的mscorlib庫。首先點擊解決方案資源管理器頂部的“顯示所有文件”,以便展開服務參考。
- 找到
Reference.cs文件並打開它。- 在原始碼中搜尋
ClientBase以確保您確實沒有生成具有您不期望的名稱的客戶端。如果您找到它,那麼這就是您的服務客戶端的名稱。
如果沒有匹配項,則右鍵點擊服務引用並選擇
Configure Service Reference。重要的是**
mscorlib**正確生成客戶端所需的。我也喜歡選擇System.Xml.Linq獲得漂亮的 Linq 類,比如XElement和 notXmlElement。
還是卡住了?
- 提示:我總是喜歡為服務參考創建一個專用的 DLL。如果您需要將其清除並重新開始,它會有所幫助,並且它可以偶爾避免某些雞和蛋的編譯問題。
- 如果您最終得到半個 References.cs 文件,則您可能“重用了與您的數據合同不兼容的引用類型”。即,您在伺服器端添加了數據成員,或者更改了現有成員的簽名,例如使值類型可選。
- 首先,意識到 SVCUTIL 會很高興地生成一個不完整的輸出文件,即使它有問題,並且從 Visual Studio 執行時,您不會得到日誌文件。在 Explorer 中留意預期尺寸,並將其與您的“最後已知良好”尺寸進行比較。
- 嘗試直接從批處理文件執行 SVCUTIL.EXE(記住保存此文件以備下次使用)
- 這是在 Visual Studio 命令提示符下最容易做到的
- 範例命令如下,請注意
reference您從中引用類型的 DLL 的參數。svcutil.exe <http://dev.example.com/SSWPF.Web/Services/SS.svc> /reference:bin\debug\RRStore.Sys.DLL
Detail: An exception was thrown while running a WSDL import extension:System.ServiceModel.Description.DataContractSerializerMessageContractImporter 錯誤:引用類型“SS.Sys.ShippingRateInfo,RRStore.Sys,版本=1.0.0.0,Culture=neutral,PublicKeyToken=null”,命名空間“ http:// schemas.datacontract.org/2004/07/SS.Sys ’ 不能使用,因為它與導入的 DataContract 不匹配。需要從引用類型中排除此類型。錯誤源的 XPath://wsdl:definitions[@targetNamespace=’ <http://tempuri.org/> ‘]/wsdl:portType[@name=‘ISSWCF’]
幸運的是這裡的答案很簡單,我的類型
ShippingRateInfo已經改變並且我沒有更新它。一旦我從伺服器複製了這種類型,一切都編譯得很好(我選擇恢復到 VS 工具)。


