Клиент SOAP в C # без доступа к WSDL-файлу - PullRequest
13 голосов
/ 10 ноября 2008

Я работаю с третьей стороной над интеграцией некоторых наших систем со своими, и они предоставляют нам интерфейс SOAP для выполнения определенных запросов и изменений в их подключенных системах. Проблема для меня заключается в том, что они не предоставляют WSDL-файл, с которым я могу работать. Если бы у меня был WSDL-файл, было бы просто запустить команду .NET (wsdl.exe) и сгенерировать прокси-класс для взаимодействия со службой.

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

Обычно ли иметь SOAP-сервис без WSDL-файлов? (Я спрашиваю об этом, так как мы собираемся добавить больше внешних систем в будущем)

Кто-нибудь работал с прокси-классом или любой другой формой клиента против службы без WDSL и есть хорошие советы о том, как это сделать?

Ответы [ 4 ]

7 голосов
/ 14 сентября 2010
string EndPoints = "http://203.189.91.127:7777/services/spm/spm";

string New_Xml_Request_String = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><soapenv:Body><OTA_AirLowFareSearchRQ EchoToken=\"0\" SequenceNmbr=\"0\" TransactionIdentifier=\"0\" xmlns=\"http://www.opentravel.org/OTA/2003/05\"><POS xmlns=\"http://www.opentravel.org/OTA/2003/05\"><Source AgentSine=\"\" PseudoCityCode=\"NPCK\"  TerminalID=\"1\"><RequestorID ID=\"\"/></Source><YatraRequests><YatraRequest DoNotHitCache=\"true\" DoNotCache=\"false\" MidOfficeAgentID=\"\" AffiliateID=\"\" YatraRequestTypeCode=\"SMPA\"/></YatraRequests></POS><TravelerInfoSummary><AirTravelerAvail><PassengerTypeQuantity Code=\"ADT\" Quantity=\"1\"/><PassengerTypeQuantity Code=\"CHD\" Quantity=\"1\"/><PassengerTypeQuantity Code=\"INF\" Quantity=\"1\"/></AirTravelerAvail></TravelerInfoSummary> <SpecificFlightInfo><Airline Code=\"\"/></SpecificFlightInfo><OriginDestinationInformation><DepartureDateTime>" + DateTime.Now.ToString("o").Remove(19, 14) + "</DepartureDateTime><OriginLocation CodeContext=\"IATA\" LocationCode=\"DEL\">" + Source + "</OriginLocation><DestinationLocation CodeContext=\"IATA\" LocationCode=\"BOM\">" + Destincation + "</DestinationLocation></OriginDestinationInformation><TravelPreferences><CabinPref Cabin=\"Economy\"/></TravelPreferences></OTA_AirLowFareSearchRQ></soapenv:Body></soapenv:Envelope>";


 protected string HttpSOAPRequest_Test(string xmlfile, string proxy)
    {
        try
        {
            System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
            doc.InnerXml = xmlfile.ToString();
            HttpWebRequest req = (HttpWebRequest)WebRequest.Create(EndPoints);
            req.Timeout = 100000000;
            if (proxy != null)
                req.Proxy = new WebProxy(proxy, true);
            req.Headers.Add("SOAPAction", "");
            req.ContentType = "application/soap+xml;charset=\"utf-8\"";
            req.Accept = "application/x-www-form-urlencoded"; //"application/soap+xml";
            req.Method = "POST";
            Stream stm = req.GetRequestStream();
            doc.Save(stm);
            stm.Close();
            WebResponse resp = req.GetResponse();
            stm = resp.GetResponseStream();
            StreamReader r = new StreamReader(stm);
            string myd = r.ReadToEnd();
            return myd;
        }

   catch (Exception se)
        {
            throw new Exception("Error Occurred in AuditAdapter.getXMLDocumentFromXMLTemplate()", se);
        }
    }
4 голосов
/ 10 ноября 2008

Если вы напишите класс, производный от System.Web.Services.Protocols.SoapHttpClientProtocol (и имеющий правильные атрибуты, например, WebServiceBinding, SoapDocumentMethod и т. Д., Примененные к нему и его методам), вы можете довольно легко вызывать методы SOAP без необходимости файл WSDL.

Самый простой способ сделать это - написать собственный веб-сервис ASP.NET, который реплицирует сторонний API SOAP, сгенерировать из него прокси-класс, а затем вручную отредактировать файл, чтобы убедиться, что URL, пространства имен, метод имена, типы параметров и т. д. являются правильными для стороннего API, который вы хотите вызвать.

1 голос
/ 05 января 2009

код здесь находится в VB.NET, но я думаю, вы поймете идею. Ниже приведен клиент, который вызывает метод processConfirmation и ожидает ответ (MyBase.SendRequestResponse).

Imports Microsoft.Web.Services3
Imports Microsoft.Web.Services3.Addressing
Imports Microsoft.Web.Services3.Messaging

Namespace Logic
    Public Class HTTPClient
        Inherits Soapclient

        Sub New(ByVal destination As EndpointReference)
            MyBase.Destination = destination
        End Sub

        <SoapMethod("processConfirmation")> _
        Public Function processConfirmation(ByVal envelope As SoapEnvelope) As SoapEnvelope
            Return MyBase.SendRequestResponse("processConfirmation", envelope)
        End Function
    End Class
End Namespace

И вы используете его, выполнив следующее:

Dim hc As New HTTPClient(New Microsoft.Web.Services3.Addressing.EndpointReference(New System.Uri("http://whatever.srv")))

Dim envelope As New Microsoft.Web.Services3.SoapEnvelope
Dim doc As New Xml.XmlDocument
doc.LoadXml("<hey>there</hey>")
envelope.SetBodyObject(doc)

Dim return_envelope As Microsoft.Web.Services3.SoapEnvelope = hc.processConfirmation(envelope)

Я думаю, что это должно сработать .... успех!

1 голос
/ 10 ноября 2008

Я не создал интерфейс SOAP без доступа к файлу WSDL, но формат довольно хорошо задокументирован . Лучше всего было бы создать собственный упрощенный файл WSDL, который отражает то, что вы знаете об услуге, на которую подписываетесь ...

Если вы решите пойти по этому пути, существующий вопрос переполнения стека указывает на некоторые инструменты для проверки вашего WSDL.

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