2010-06-16 125 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