2011-07-29 65 views
1

這可能是一個非常愚蠢的問題,但我一直無法找出解決方案。 我有一個WCF服務託管在使用SiteMinder驗證的網站上。身份驗證依賴於客戶端請求中的cookie。問題是,當我嘗試使用svcutil生成代理類時,操作失敗,因爲當svcutill嘗試獲取元數據時,它顯然不會將SiteMinder cookie添加到其請求中。因此,我想知道是否有一種簡單的方法以編程方式生成WCF服務代理類。在受SiteMinder保護的站點上暴露WCF元數據

回答

1

如果您有權訪問編譯的服務DLL文件,則可以使用the SvcUtil command line utility爲數據協定生成WSDL和關聯的XSD。這種方法的主要缺點是您需要在schemaLocation屬性值的每個xsd:import元素中添加由SvcUtil生成的XSD文件的名稱。

下面是修改後的xsd:import元素的示例。對於「http://tempuri.org/」命名空間,我添加了schemaLocation屬性值爲「tempuri.org.xsd」以便知道添加服務引用進程知道在與WSDL文件相同的文件夾中查找該文件。如果您的WSDL使用wsdl:import,請添加一個位置屬性而不是schemaLocation屬性。這個related question and answer應該有一個好的開始。

<wsdl:types> 
    <xsd:schema targetNamespace="http://tempuri.org/Imports"> 
     <xsd:import namespace="http://tempuri.org/" schemaLocation="tempuri.org.xsd" /> 
     <xsd:import namespace="http://schemas.microsoft.com/2003/10/Serialization/" schemaLocation="schemas.microsoft.com.2003.10.Serialization.xsd" /> 
    </xsd:schema> 
    </wsdl:types> 

編輯:

生成使用已編譯服務DLL客戶端代碼需要一個兩個步驟過程。 SvcUtil需要服務WSDL來生成客戶端。它不能直接使用編譯的DLL。

首先使用包含ServiceContract的DLL生成WSDL。如果服務合約DLL也在同一個文件夾中,我認爲你可以使用服務實現文件。

cd "\Path\To\Your\Service\DLLs" 
svcutil YourService.DLL 

這將根據您的服務結構創建多個文件。將會有一個.WSDL文件和幾個.XSD文件。如上所示編輯這些文件。

最後,無論使用Visual Studio添加服務引用對話框來選擇編輯.wsdl文件(只需輸入完整的路徑和文件名)生成客戶端代碼或使用SvcUtil工具如下:

svcutil *.wsdl *.xsd /language:C# 
+0

我可能沒有清楚我的問題:我的問題是,svcutil無法訪問元數據,因爲它受SiteMinder保護。 –

+0

對,您在SvcUtil命令行中使用服務MEX URL,並且由於存在安全隱患,這不起作用。我建議你使用包含服務契約的DLL生成WSDL,然後從中生成客戶端。我會更新答案以明確。 –

+0

哦,我現在明白了:))謝謝你。 –