Клиент SOAP на С# без доступа к WSDL файлу
Я работаю с третьей стороной, чтобы интегрировать некоторые из наших систем с их помощью, и они предоставляют нам интерфейс SOAP для выполнения определенных запросов и изменений в их подключенных системах. Проблема для меня в том, что они не предоставляют WSDL файл для меня, чтобы работать против. Если бы у меня был WSDL файл, было бы просто просто запустить предоставленную команду .NET(wsdl.exe) и создать прокси-класс для взаимодействия с сервисом.
Есть ли "простой" способ сделать это без WSDL файла? У меня есть все функции, которые мы можем получить, и какие параметры мне нужно отправить, и что я должен ожидать взамен.
Как правило, имеет SOAP-сервис без WSDL файлов? (Я спрашиваю об этом, так как мы собираемся добавить в систему больше внешних систем в будущем)
Кто-нибудь сделал прокси-класс или любую другую форму клиента против службы WDSL-less и имел какие-либо хорошие указания о том, как это сделать?
Ответы
Ответ 1
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);
}
}
Ответ 2
Если вы пишете класс, который происходит от System.Web.Services.Protocols.SoapHttpClientProtocol
(и имеет к нему соответствующие атрибуты, например, WebServiceBinding
, SoapDocumentMethod
и т.д. и т.д.), вы можете довольно легко вызвать методы SOAP без необходимости файл WSDL.
Самый простой способ сделать это - это, вероятно, написать собственный веб-сервис ASP.NET, который реплицирует сторонний SOAP API, сгенерирует из него прокси-класс, затем вручную отредактирует файл, чтобы убедиться, что URL-адрес, пространства имен, метод имена, типы параметров и т.д. верны для стороннего API, который вы хотите вызвать.
Ответ 3
Я не создал SOAP-интерфейс без доступа к WSDL файлу, но формат довольно хорошо документирован. Лучше всего создать простой файл WSDL, который отражает то, что вы знаете о сервисе, на который вы подписались....
Если вы решите пойти по этому маршруту, существующий вопрос о стекеповерхности указывает на некоторые инструменты для проверки вашего WSDL.
Ответ 4
код здесь находится в 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)
Я думаю, что это должно сработать... успех!