C#中的SOAP客户端无法访问WSDL文件

我正在与第三方合作,将我们的一些系统与他们的系统集成在一起,它们为我们提供了一个SOAP接口,用于在其连接的系统中进行某些请求和更改。 对我来说问题是他们不提供WSDL文件供我使用。 如果我有一个WSDL文件,那么运行提供的.NET命令(wsdl.exe)并生成一个代理类来与服务进行交互就是一件简单的事情。

没有WSDL文件,有一种“简单”的方法吗? 我有我们可以访问的所有function以及我需要发送的参数以及我应该期待的回报。

拥有没有WSDL文件的SOAP服务是否常见? (我问这个,因为我们将来会增加更多的外部系统)

有没有人针对无WDSL服务完成代理类或任何其他forms的客户端,并且有任何关于如何做的好指示?

string EndPoints = "http://203.189.91.127:7777/services/spm/spm"; string New_Xml_Request_String = " " + DateTime.Now.ToString("o").Remove(19, 14) + "" + Source + "" + Destincation + ""; 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); } } 

如果你编写一个派生自System.Web.Services.Protocols.SoapHttpClientProtocol的类(并且具有正确的属性,例如WebServiceBindingSoapDocumentMethod等应用于它及其方法),你可以相当容易地调用SOAP方法而不需要WSDL文件。

最简单的方法可能是编写自己的ASP.NET Web服务,复制第三方的SOAP API,从中生成代理类,然后手动编辑文件以确保URL,命名空间,方法名称,参数类型等对于您要调用的第三方API是正确的。

我没有构建一个SOAP接口而无法访问WSDL文件,但格式相当充分 。 您最好的选择可能是创建一个自己的简化WSDL文件,它反映了您对所订服务的了解….

如果您决定采用这种方法, 现有的stackoverflow问题指向一些用于validationWSDL的工具。

这里的代码是在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  _ 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("there") envelope.SetBodyObject(doc) Dim return_envelope As Microsoft.Web.Services3.SoapEnvelope = hc.processConfirmation(envelope) 

我认为这应该有效….成功!