.Net - Потребление веб-сервиса без WSDL - PullRequest
8 голосов
/ 23 мая 2011

У нас есть новая система учета, которая предоставляет интерфейс веб-сервиса для внешних клиентов.Я хочу получить доступ к одному из интерфейсов, но WSDL нет, поэтому я создал запрос с помощью HttpWebRequest, и он работает нормально.

Однако, чтобы упростить создание запросов и синтаксический анализ ответа, я хотел бы создать некоторую функцию автоотображения.У меня есть структура запроса и ответа в XSD-файле.Есть идеи?

Запрос на создание:

public void SendRequest()
{
    HttpWebRequest request = CreateWebRequest();
    XmlDocument soapEnvelopeXml = new XmlDocument();
    soapEnvelopeXml.LoadXml(@"<?xml version=""1.0"" encoding=""utf-8""?>
        <soap:Envelope xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"">
        <soap:Body xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"">

            ++ structure type inserted here ++   

        </soap:Body>
        </soap:Envelope>");

    using (Stream stream = request.GetRequestStream())
    {
        soapEnvelopeXml.Save(stream);
    }

    using (WebResponse response = request.GetResponse())
    {
        using (StreamReader rd = new StreamReader(response.GetResponseStream()))
        {
            string soapResult = rd.ReadToEnd();
            Console.WriteLine(soapResult);
        }
    }
}

Ответы [ 2 ]

1 голос
/ 24 мая 2011

Я рекомендую вам Создать WSDL - перепроектировать его, а затем создать из него заглушки для клиентов веб-сервисов.

Способ сделать это:

  1. Получить проводную трассировку точного запроса и ответа, который использует веб-служба.Используйте Fiddler или что-то подобное.

  2. Создание службы WCF, которая приблизительно соответствует запросу и ответу.

  3. Получите след , который

  4. Сравните (3) с (1).Помните, что вы хотите эквивалентность XML-инфо-набора.Например, ваши префиксы пространства имен не обязательно должны быть одинаковыми.Ваши пространства имен не должны быть объявлены в том же месте.Но имена элементов должны быть точно такими же, а строки xmlns должны быть точно такими же.Измените службу WCF, чтобы она более точно соответствовала оригиналу.Перезапустите его, перейдите к шагу 3. Выполните итерацию столько раз, сколько потребуется.

  5. направьте своего клиента WCF на настоящий веб-сервис

  6. расслабьтесь и расслабьтесь.

Я сделал это, и это работает.Это может быть сложно, если вы не понимаете, как атрибуты DataContract влияют на XML в сети.Но, поиграв с ним, вы быстро поймете это.

Но как это возможно, что это сервис SOAP и на стороне сервиса нет WSDL?Это может сэкономить вам массу усилий, чтобы удвоить ваши усилия по поиску реального WSDL.

1 голос
/ 23 мая 2011

Что ж, если у вас действительно нет способа получить правильный файл WSDL, но у вас есть XSD: s, вы, вероятно, можете использовать инструмент xsd.exe для создания классов, которые соответствуют вашим запросам и типам ответов.

Примерно так (запустите это в командной строке Visual Studio)

xsd.exe TheRequest.xsd /c /n:Your.Namespace
xsd.exe TheResponse.xsd /c /n:Your.Namespace

Но на самом деле, постарайтесь найти WSDL, это сделает вашу жизнь намного проще ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...