我正在与第三方合作,将我们的一些系统与他们的系统集成在一起,他们为我们提供了一个SOAP接口,用于在其连接的系统中进行某些请求和更改。对我来说问题是他们不提供WSDL文件供我使用。如果我有一个WSDL文件,那么运行提供的.NET命令(wsdl.exe)并生成一个代理类来与服务进行交互就是一件简单的事情。
如果没有WSDL文件,是否有“简单”的方法可以做到这一点?我拥有了我们可以访问的所有功能以及我需要发送的参数以及我应该期待的回报。
没有WSDL文件的SOAP服务是否常见? (我问这个,因为我们将来会增加更多的外部系统)
是否有人针对无WDSL的服务完成了代理类或任何其他形式的客户端,并且有任何关于如何做的好指示?
答案 0 :(得分:7)
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);
}
}
答案 1 :(得分:4)
如果你编写一个派生自System.Web.Services.Protocols.SoapHttpClientProtocol
的类(并且具有正确的属性,例如,WebServiceBinding
,SoapDocumentMethod
等应用于它及其方法),你可以公平地无需WSDL文件即可轻松调用SOAP方法。
最简单的方法可能是编写自己的ASP.NET Web服务,复制第三方的SOAP API,从中生成代理类,然后手动编辑文件以确保URL,命名空间,方法名称,参数类型等对于您要调用的第三方API是正确的。
答案 2 :(得分:1)
我没有构建SOAP接口而无法访问WSDL文件,但格式为fairly well-documented。您最好的选择可能是创建一个自己的简化WSDL文件,该文件反映了您对所订服务的了解....
如果您决定采用这条路线,可以使用existing stackoverflow question点来验证您的WSDL。
答案 3 :(得分:1)
这里的代码是在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)
我认为这应该有效......成功!