【问题标题】:Consuming SOAP web service in ASP.NET在 ASP.NET 中使用 SOAP Web 服务
【发布时间】:2010-07-26 21:15:28
【问题描述】:

我有一个 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 服务获得正确的响应吗?

【问题讨论】:

  • 你到底为什么要手工制作肥皂信息?
  • Idk 如果我应该对此表示赞成,因为它是一个很好的做错的例子,或者出于同样的原因反对它......

标签: c# web-services soap


【解决方案1】:

如果你有 WSDL,你可以在 Visual Studio 中创建一个服务引用,它会为你生成一个代理类。除非我在您的问题中遗漏了一些要点,否则它会更可靠,也更容易实施和使用。

希望对您有所帮助。

【讨论】:

  • @John - 你能详细说明一下吗?编辑:你肯定不是指我没有使用“服务参考”术语的小失礼吗?我会及时更新,但仍然对为什么这会是一个糟糕的答案感到困惑..
  • Idk 如果我愿意 -1 他建议“网络参考”与“服务参考”。如果他使用的是旧版本的 .net 或 Visual Studio,那是他唯一的选择。无论如何,它比手动调用要理智得多
  • John 是一个 WCF 人,当有人想要使用 VS2K5 样式的 Web 引用时,他并不太高兴。我自己无法反驳,但在某些情况下(尤其是 SharePoint),当 Web 引用起作用时,简单的服务引用不起作用。
  • 如果提问者恰好使用 Visual Studio 2005,则“添加服务引用”选项不存在。我们真正知道的是,所涉及的技术是 C# 和 SOAP Web 服务。
  • @Kieren:“网络参考”并非次要。对于不熟悉这方面的人来说,他们很可能会走上错误的轨道,在未来几年内无缘无故地使用遗留技术。我看到开发人员开始使用 WSE 仅仅是因为在 Google 搜索“Web 服务安全”时出现了一个 WSE 示例。人们实际上听从我们的建议,所以我们必须小心。既然你已经纠正了错误,我已经删除了反对票。
【解决方案2】:

我刚刚注意到您在服务器端使用此代码。


这不是在 .NET 中使用 Web 服务的方式。使用 Visual Studio 中的“添加服务引用”命令创建代理类,让您可以非常轻松地使用服务。

请参阅How to Consume a Web Service 以获取示例,以及http://msdn.microsoft.com/wcf/。

此外,从不在处理 XML 时使用字符串操作技术。简而言之,字符串和 XML 的规则是不同的。 .NET 有几个 XML APIs 来处理 XML,它们都知道规则。

【讨论】:

  • 您所说的“从服务器端使用 SOAP 服务通常会更好。它更容易”是什么意思。 ?
  • @Allen:直到我注意到“string.Empty”,我以为这是 JavaScript。
【解决方案3】:

看了一眼你的代码,你好像忘了添加正文开始标签:&lt;soapenv:Body&gt;

除非您有特殊原因需要手动构建消息,否则我强烈建议您使用使用 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 消息的方法,那么我至少建议您在应用程序中添加一些日志记录,以便在出现问题时更轻松地分析构造的消息。

【讨论】:

  • (由于可能不正确,删除了我之前的评论)我同意你的观点;此时,如果可用,WCF 应该是推荐的方法。请注意,在 MSDN 上的 VS2010 ASP.NET Web 服务 (msdn.microsoft.com/en-us/library/yzbxwf53.aspx) 下的许多链接特别提到“Web 参考”/wsdl.exe 功能是遗留的,是为了向后兼容而提供的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-24
  • 2012-05-18
  • 2011-05-16
  • 2016-11-29
  • 1970-01-01
相关资源
最近更新 更多