2010-06-16 122 views
4

我正在尋找一些集成測試來比較WCF服務與先前(和已發佈)版本生成的WSDL。這是爲了確保服務合同與發佈時間沒有區別。如何以編程方式從WCF服務生成WSDL(集成測試)

我想我的測試是自包含的,不依賴任何外部資源,例如在IIS上託管。

,我想我可以重新創建我的IIS有類似的測試中託管環境...

using (ServiceHost host = new ServiceHost(typeof(NSTest.HelloNS), new Uri("http://localhost:8000/Omega"))) 
{ 
    host.AddServiceEndpoint(typeof(NSTest.IMy_NS), new BasicHttpBinding(), "Primary"); 
    ServiceMetadataBehavior behavior = new ServiceMetadataBehavior(); 
    behavior.HttpGetEnabled = true; 
    host.Description.Behaviors.Add(behavior); 
    host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpBinding(), "mex"); 
    host.Open(); 
} 

沒有任何人有任何更好的想法?

編輯: 很明顯,這段代碼只是創建一個服務主機,我仍然錯過客戶端代碼來獲取WSDL定義。

+0

這是一個錯誤的比較文件。該文件可以更改而不會更改語義。 – 2010-10-01 00:56:07

回答

0

你需要注意的一件事是比較整個WSDL。 WCF打破了WSDL,與傳統的Web服務(asmx)WSDL不同。這意味着信息的核心位於?WSDL頁面上,但是,也會有多個XSD(.svc?XSD = XSD0,1,2 ...)和可能的多個WSDL頁面(?WSDL和?WSDL =例如WSDL0)。

完成此操作的一種方法是生成webrequest以從根wsdl獲取數據。然後,您可以在WSDL中搜索類似(yourServicename).svc?WSDL = WSLD0和(yourServicename)?XSD = XSD0等任何內容,爲每個WSDL和XSD生成附加web請求。

1

查看MSDN上的WsdlExporter。它用於在WCF中生成wsdl。 你也可以看看svcutil和反射器,看看它如何生成wsdl信息,因爲該工具可以從dll文件生成wsdl。

做比較的另一種方法是使用svcutil工具生成wsdl並將其與服務的保存/基線版本進行比較。在您的測試中運行svcutil,並根據舊文件驗證輸出。由於您需要svcutil,因此不是完全獨立的測試...

2

只需使用Web客戶端和?WSDL sufix在URL

 
using (ServiceHost host = new ServiceHost(typeof(NSTest.HelloNS), 
new Uri("http://localhost:8000/Omega"))) 
{ 
    host.AddServiceEndpoint(typeof(NSTest.IMy_NS), new BasicHttpBinding(), "Primary"); 
    ServiceMetadataBehavior behavior = new ServiceMetadataBehavior(); 
    behavior.HttpGetEnabled = true; 
    host.Description.Behaviors.Add(behavior); 
    host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpBinding(), "mex"); 
    host.Open(); 

    string wsdl = null; 
    using (WebClient wc = new WebClient()) 
    { 
     using (var stream = wc.OpenRead("localhost:8000/Omega?wsdl")) 
     { 
      using (var sr = new StreamReader(stream)) 
      { 
       wsdl = sr.ReadToEnd(); 
      } 
     } 
    } 
    Console.Write(wsdl); 
} 

0

相同的答案翻譯成VB

Using host = New ServiceHost(GetType(MyHelloWorldWcfLib.HelloWorldServer), New Uri("http://localhost:8000/Omega")) 

     host.AddServiceEndpoint(GetType(MyHelloWorldWcfLib.IHelloWorld), New BasicHttpBinding(), "Primary") 
     Dim behavior = New ServiceMetadataBehavior() 
     behavior.HttpGetEnabled = True 
     host.Description.Behaviors.Add(behavior) 
     host.AddServiceEndpoint(GetType(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpBinding(), "mex") 
     host.Open() 

     Dim wsdl As String = Nothing 
     Using wc = New System.Net.WebClient() 
      Using stream = wc.OpenRead("http://localhost:8000/Omega?wsdl") 
       Using sr = New IO.StreamReader(stream) 
        wsdl = sr.ReadToEnd() 
       End Using 
      End Using 
     End Using 
     Console.Write(wsdl) 
    End Using