2012-06-27 25 views
5

我正在寫一個客戶端來訪問SOAP web服務,該服務將由第三方託管。我有定義接口和數據的WSDL和XSD。由於wsdl的原因,快速簡單地實現WCF Web服務?

我從WSDL創建服務引用時沒有問題,但是在構建實現​​它的簡單Web服務時遇到問題,我可以使用它來測試。 (第三方的服務還沒有準備好,但是,即使它運行了,我仍然想對我自己的測試服務器進行初始測試,而不是針對他們的測試服務器。)

我瀏覽過,並且顯然我可以使用svcutil爲服務生成接口:

svcutil.exe thewsdl.wsdl thexsd.xsd /language:c# /out:ITestService.cs 

這會生成一個包含服務接口定義的文件。但現在呢?

我覺得最簡單的方法是建立一個自託管服務,所以我創建了一個新的控制檯應用程序,並在其中實現了一個從服務接口定義派生的類,並使用ServiceHost 。

它運行,當它運行時,我能夠在我的客戶端應用程序中創建服務引用。但是當我嘗試從客戶端應用程序調用它時,出現錯誤:

The provided URI scheme 'http' is invalid; expected 'https'. 

解決此問題的最簡單方法是什麼?是否有簡單的方法來簡單地關閉身份驗證和授權,並且只允許無限制的訪問?

編輯:

我加入懸賞這個,因爲原來的問題似乎已經引起了不重視。

但讓我們來看看關鍵。我正在嘗試針對客戶的SOAP服務編寫客戶端。作爲開發的一部分,我想創建自己的測試WCF服務,它實現相同的WSDL。

所以我有一個下載的.wsdl文件和一個關聯的.xsd文件,並且我想用VS2010的調試器創建一個可以測試的服務。

這對服務是獨立運行還是在IIS內運行並不重要,或者它是生產穩定的。我所需要的只是一種接受客戶網站接受的請求的服務,並將響應返回給我的客戶,我需要它返回,以便測試我對他們的處理。

我該如何到達那裏?我已經嘗試添加一個WCF服務庫,然後在其中使用svcutil.exe來添加我的新服務,但它似乎沒有用服務器端樣板填充app.config,而我試圖重建它的天堂沒有工作。

+0

找WCF 101上intertubes。您需要指定基本的服務配置元數據。 – Cheeso

+0

你快到了。您的app.config中的某處定義了ssl是必需的。發佈它在這裏,我們將幫助你關閉這個優秀的答案 –

回答

1

我用Moq來處理這個問題。基本上在單元測試中,您指定了接口(這將在添加服務引用或使用svcutil時爲您生成)以及如果您調用該接口時希望它返回的內容。

例如以下設置:

var mock = new Mock<IFoo>(); 
mock.Setup(foo => foo.DoSomething("ping")).Returns(true); 

所以後來當你想從MOQ您服務呼叫

var myObject = new IFoo; 
var resp = myObject.DoSomething("whateverwillbeoverriddenbyping"); 

和RESP將是真實的。

除了使用Moq還有其他選項。這些選項都涉及到接口並注入其不同版本。例如,您也可以通過將接口傳遞給您的類構造函數來執行構造函數注入模擬。

+0

+1。在你跳過所有的圈套之後,WCF將爲你提供的是一個對象,它實現了反映所提供的WSDL的接口。您不需要所有的WCF guff用於測試目的。只是嘲笑界面,並繼續建立你的客戶端應用程序。 –

+0

對於我所做的,我確實需要一個實際的WCF服務。除了單元測試之外還有測試,對於我正在運行的測試,Mocks不會這樣做。 –

+0

爲服務和客戶端發佈配置文件system.serviceModel部分。 –

5

既然你想要一個完整的服務來調用,而不是嘲笑它。

遵循以下步驟:

  1. 創建新的「WCF服務應用程序」項目
  2. 複製WSDL和XSD到項目
  3. 選擇您的WSDL文件,並期待在性能部分,然後從完整路徑複製位置
  4. 右鍵單擊解決方案資源管理器中的項目,然後選擇「添加服務引用...」
  5. 對於服務地址,粘貼您之前複製的wsdl的位置一步,並打開去。它應該顯示您期待的服務操作。
  6. 點擊OK
  7. 應該爲您生成的所有對象,包括界面和配置文件(儘管在這一點上是在config-客戶端,我們將不得不關掉這個是服務)
  8. 現在你應該在system.serviceModel部分中添加服務配置部分。由於我不知道wsdl的具體內容,因此應該在system.serviceModel節中創建服務節點,並從生成的客戶機節點複製端點節點。例如下面的服務節點,可以空出的地址現在:
<system.serviceModel> 
    <services> 
     <service name="YourService"> 
     <endpoint address="" 
       binding="basicHttpBinding" bindingConfiguration="WeatherSoap" 
       contract="ServiceReference1.WeatherSoap" name="WeatherSoap" />  
     </service> 
  1. 刪除客戶端節點在配置
  2. 在服務上,產生當它執行的是不同的接口該項目,因此您將要替換使用上面端點中的契約屬性中列出的接口實現的接口。然後實施其成員,它應該爆炸可用的操作。你可以填寫任何你想要的服務操作返回。
  3. 取決於什麼的WSDL中有,我們可能需要做一些事情,讓必需的綁定運行 - 像的WSHttpBinding,NetTcpBinding的建立等