[英]How to programmatically generate WSDL from WCF service (Integration Testing)
我期待编写一些集成测试来比较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定义。
只需在URL中使用WebClient和?wsdl sufix
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); }
查看MSDN上的WsdlExporter 。 它用于在WCF中生成wsdl。 您还可以查看带反射器的svcutil,了解它如何生成wsdl信息,因为该工具可以从dll文件生成wsdl。
另一种进行比较的方法是使用svcutil工具生成wsdl并将其与服务的已保存/基线版本进行比较。 在测试中运行svcutil并根据旧文件验证输出。 不是真正独立的测试,因为你需要svcutil ...
这样的事怎么样? 使用C#创建WSDL
同样的答案翻译成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
您需要注意的一件事是比较整个WSDL。 与传统的Web服务(asmx)WSDL不同,WCF分解了WSDL。 这意味着info的核心位于?WSDL页面上,但是,也会有多个XSD(.svc?XSD = XSD0,1,2 ......)和可能的多个WSDL页面(?WSDL和?WSDL =例如WSDL0)。
实现此目的的一种方法是生成webrequest以从根wsdl获取数据。 然后,您可以在WSDL中搜索(yourServicename).svc?WSDL = WSLD0和(yourServicename)?XSD = XSD0等等,为每个WSDL和XSD生成其他Web请求。
您可能最好使用SoapUI来测试WSDL,而不是直接依赖NUnit。
如果你想从NUnit调用SoapUI,它可能,但有点笨重。 有关详细信息,请参阅http://enthusiasm.soapui.org/forum/viewtopic.php?f=2&t=15 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.