Как программно сгенерировать WSDL из службы WCF (интеграционное тестирование) - PullRequest
4 голосов
/ 16 июня 2010

Я хочу написать несколько интеграционных тестов для сравнения WSDL, сгенерированного сервисами WCF, с предыдущими (и опубликованными) версиями. Это делается для того, чтобы контракты на обслуживание не отличались от времени выпуска.

Я бы хотел, чтобы мои тесты были автономными и не полагались на какие-либо внешние ресурсы, такие как хостинг на 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();
}

У кого-нибудь есть идеи получше?

EDIT: Очевидно, что этот код просто создает хост для службы, мне все еще не хватает клиентского кода для получения определения WSDL.

Ответы [ 6 ]

2 голосов
/ 14 марта 2012

Просто используйте WebClient и суффикс? Wsdl в 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);
}

1 голос
/ 01 октября 2010
1 голос
/ 17 сентября 2010

Проверьте WsdlExporter на MSDN. Используется для генерации wsdl в WCF. Вы также можете посмотреть в svcutil with отражатель, чтобы увидеть, как он генерирует информацию wsdl, так как инструмент может генерировать wsdl из dll-файла.

Другим способом сравнения будет использование инструмента svcutil для генерации wsdl и сравнения его с сохраненной / базовой версией сервиса. Запустите svcutil в своем тесте и проверьте вывод по старым файлам. Не совсем автономный тест, так как вам понадобится svcutil ...

0 голосов
/ 18 июля 2012

Тот же ответ переведен на 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
0 голосов
/ 01 сентября 2010

Возможно, вам лучше использовать SoapUI для тестирования WSDL, а не полагаться на NUnit напрямую.

Если вы хотите вызвать SoapUI из NUnit, это возможно, но немного неуклюже. См. http://enthusiasm.soapui.org/forum/viewtopic.php?f=2&t=15 для получения дополнительной информации.

0 голосов
/ 16 июня 2010

Одна вещь, с которой вам нужно быть осторожным, это сравнить весь WSDL. WCF разбивает WSDL в отличие от WSDL классических веб-сервисов (asmx). Это означает, что ядро ​​информации находится на странице? WSDL, однако также будет несколько XSD (.svc? XSD = XSD0, 1, 2 ...) и, возможно, несколько страниц WSDL (? WSDL и? WSDL = WSDL0 например).

Один из способов сделать это - сгенерировать веб-запрос для получения данных от корневого wsdl. Затем вы можете искать в WSDL что-нибудь вроде (yourServicename) .svc? WSDL = WSLD0 и (yourServicename)? XSD = XSD0 и так далее, создавая дополнительные веб-запросы для каждого WSDL и XSD.

...