我有一个SOAP WSDL(在这里找到:https://portal.bsh-partner.com/picenter/server/a2a/),我正在尝试使用Web服务。
var soapEnvelope = string.Empty;
soapEnvelope = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
soapEnvelope += "<soapenv:Envelope xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:q0=\"http://thexmlhost.com\">";
soapEnvelope += "<q0:Connect>";
soapEnvelope += "<q0:Username>username</q0:Username>";
soapEnvelope += "<q0:Password>password</q0:Password>";
soapEnvelope += "</q0:Connect>";
soapEnvelope += "</soapenv:Body>";
soapEnvelope += "</soapenv:Envelope>";
var xmlHttp = new MSXML2.ServerXMLHTTP40();
xmlHttp.open("POST", "https://thexmlhost.com/", "", "");
xmlHttp.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
xmlHttp.setRequestHeader("SOAPAction", "thexmlhost.com/");
xmlHttp.send(soapEnvelope);
xmlHttp.waitForResponse(500);
var outXml = xmlHttp.responseText;
响应不断返回常规HTTP响应错误页面。知道我应该如何通过我的Soap Envelope从Web服务中获得正确的响应吗?
答案 0 :(得分:22)
如果您有WSDL,则可以在Visual Studio中创建服务引用,它将为您生成代理类。除非我在你的问题中遗漏了一些细节,否则实施和使用会更加可靠,更容易。
希望有所帮助。
答案 1 :(得分:9)
我刚注意到您在服务器端使用此代码。
这不是在.NET中使用Web服务的方法。使用Visual Studio中的“添加服务引用”命令创建代理类,以便您轻松使用该服务。
请参阅How to Consume a Web Service以获取示例,以及http://msdn.microsoft.com/wcf/。
此外,从不在使用XML时使用字符串操作技术。简而言之,字符串和XML的规则是不同的。 .NET有几个XML API可以使用XML,它们都知道规则。
答案 2 :(得分:3)
只是看了一下你的代码,看起来你忘了添加你的身体开始标记:<soapenv:Body>
除非您有特殊原因要手动构建邮件,否则强烈建议您使用使用Visual Studio 2008或更高版本附带的svcutil.exe工具生成的代理。 (如果使用“添加服务引用”功能,Visual Studio会自动使用此工具),假设使用WCF处理与Web服务的通信时没有问题。
或者,如果由于某种原因您无法使用WCF,例如,如果您正在使用Visual Studio 2005在.Net 2.0中进行开发,在这种情况下您将无法使用“添加服务引用”功能,那么仍然可以使用Visual Studio较旧的“添加Web引用”功能为您的Web服务生成代理。此功能使用wsdl.exe工具而不是svcutil.exe。
否则,如果你真的必须继续这种手工构建SOAP消息的方法,那么我至少建议在你的应用程序中添加一些日志记录,以便在出现问题时更容易分析构造的消息。