如何将数据作为SoapMessage发送并得到回复?

时间:2019-04-08 07:29:34

标签: c# soap

我有一些数据需要以SOAP格式发送到服务器。该服务器将立即确认它已收到消息。几个小时后,我(可能是从另一台服务器)收到了一条SOAP消息,其中包含有关已处理数据的信息。

我读了Stackoverflow: How to send SOAP request and receive response。但是,答案是8岁。尽管它们可能仍然有效,但是可能存在更新的技术。

似乎确实存在:Microsoft具有System.Web.Services.Protocols,具有SoapMessage,SoapClientMessage,SoapServerMessage等类。

查看这些类,我发现很多类似SOAP的类(标头,扩展名,客户端消息,服务器消息...通常,所提供的示例向我指示了这些类如何协同工作以及如何使用它们。我只能在MSDN文档中找到有关如何处理已经存在的SOAP消息的示例。

  

给出一些需要发送的数据,如何将这些数据包装在这些SOAP类之一中并发送此消息?

这些类是否为此目的?还是我应该坚持2011年的方法,您可以通过上面提到的Stackoverflow问题所建议的那样通过自己以肥皂格式格式化XML数据来创建SOAP Web请求?

非常抱歉,通常我会写一些我尝试过的东西。 las,我看不到provided SoapMessage classes之间的关系。我不知道如何使用它们。

在评论后添加

我正在使用Windows Server / Visual Studio(最新版本)/。NET(最新版本)/ C#(最新版本)。

与服务器的通信是相互认证的。我需要用于与服务器通信的证书为PEM(CER / CRT)格式。私钥是RSA。该证书由适当的CA颁发,服务器还将使用适当的CA使用的证书。因此,我不需要创建新的证书(实际上,它不会被接受)。如果需要,我愿意使用OpenSsl之类的程序来转换证书。

我尝试使用Apache TomCat进行通信,但是我觉得对于每天发送一条SOAP消息并每天等待一个答案的任务来说,这太过麻烦了。

也许因为Java对我来说是一种全新的技术,所以我很难看到接收到的消息的内容。回到C#和.NET。

我打算创建一个供控制台应用程序使用的DLL。该函数将流中的某些数据作为输入。它将创建肥皂消息,发送该消息,等待正确接收到该消息的答复,然后等待(可能几个小时)以获取一条包含处理后数据结果的新肥皂消息。为了使正确的报告和取消成为可能,我认为最好使用async-await

如果在一个应用程序中无法发送订单并等待结果,我愿意创建一个Windows服务来监听输入,但我希望保持简单。

(虚拟)计算机将仅用于此任务,因此没有其他人需要监听端口443。每天将发送一封订单消息,每天发送一条结果消息。

3 个答案:

答案 0 :(得分:3)

我个人使用ServiceStack来创建客户端和服务器

https://docs.servicestack.net/soap-support

或SoapHttpClient nuget

https://github.com/pmorelli92/SoapHttpClient

或者我的例子可以追溯到

Is it possible that I can convert simple string to SOAP Message and send it?

答案取决于您计划使用什么框架或库?

答案 1 :(得分:3)

这是使用HTTPS的示例C#控制台客户端和服务器代码(它们在同一示例中,但这当然仅是出于演示目的)。

对于客户端,我们重用SoapHttpClientProtocol类,但是对于服务器端,不幸的是,我们不能重用任何东西,因为类完全与ASP.NET(IIS)HttpContext类相关联

对于服务器端,我们使用HttpListener,因此,根据您的配置,服务器端可能需要管理员权限才能调用HttpListener的{​​{1}}。 / p>

该代码不使用客户端证书,但是您可以将其添加到我放置// TODO注释的位置

代码假定存在与使用的URL和端口相关联的证书。如果没有(使用Prefixes.Add(url)转储所有关联的证书),则可以使用此处描述的过程添加一个:https://stackoverflow.com/a/11457719/403671

netsh http show sslcert

答案 2 :(得分:0)

最简单的现代答案是声明一个简单的类,该类定义消息的结构,然后使用HttpClient对其进行序列化。

但是,SOAP是为基于描述的消息传递而构建的标准,因此仍然相关的建议是使用“服务引用”从wsdl描述中生成客户机代码,然后使用生成的客户机对象。

但是,我建议,就像其他人指出的那样,您尝试改用REST服务(假设这是可能的)。 代码不那么复杂,系统使用起来简单得多,并且是全球标准。

这里是两者的比较和示例...

https://smartbear.com/blog/test-and-monitor/understanding-soap-and-rest-basics/