我希望编写一些集成测试来比较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 :(得分:2)
只需在网址
中使用WebClient和?wsdl后缀即可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); }
答案 1 :(得分:1)
在MSDN上查看WsdlExporter。它用于在WCF中生成wsdl。 您还可以查看带反射器的svcutil,了解它如何生成wsdl信息,因为该工具可以从dll文件生成wsdl。
进行比较的另一种方法是使用svcutil工具生成wsdl并将其与服务的已保存/基线版本进行比较。在测试中运行svcutil并根据旧文件验证输出。不是真正独立的测试,因为你需要svcutil ......
答案 2 :(得分:1)
这样的事情怎么样? Creating a WSDL using C#
答案 3 :(得分:0)
您需要注意的一件事是比较整个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请求。
答案 4 :(得分:0)
最好使用SoapUI来测试WSDL,而不是直接依赖NUnit。
如果你想从NUnit调用SoapUI,它可能,但有点笨重。有关详细信息,请参阅http://enthusiasm.soapui.org/forum/viewtopic.php?f=2&t=15。
答案 5 :(得分: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