如何以编程方式从WCF服务生成WSDL(集成测试)

时间:2010-06-16 10:18:21

标签: wcf nunit wsdl 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定义。

6 个答案:

答案 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