如何在Web API上发布SOAP消息(ASP.NET Core-> Web API)

3
我想要将基于SOAP XML的消息发布到我在ASP.NET core项目模板中创建的Web API。但是,当我以content-type为application/soap+xml的形式发布时,现在会出现不支持的媒体类型错误。
我知道我们应该将SOAP消息发送到基于WCF的服务,但我们的要求就是这样。我应该能够在Web API中使用SOPA消息。
谢谢, Sudama

如何从不理解SOAP的服务中使用SOAP?没有合理的方法将WebAPI转换为SOAP。您必须使用WCF服务,没有其他方法可以绕过它,这意味着使用完整的.NET框架。WebAPI是一个REST API,而不是SOAP。 - Tseng
我使用以下代码来发布SOAP消息并检索主体,该主体基本上是一个xml,现在我正在尝试对其进行反序列化,但出现错误根元素丢失,否则我似乎已经找到了解决方法[HttpPost] public Find Post([FromBody] XmlDocument xmlDocument){var soapBody = xmlDocument.GetElementsByTagName("soap12:Body")[0]; string innerObject = soapBody.InnerXml; XmlSerializer deserializer = new XmlSerializer(typeof(Find)); using (TextReader reader = new StreamReader(innerObject)) { return (Find)deserializer.Deserialize(reader); } } - Sudama Tripathi
当然,您可以从请求正文中读取有效载荷。但是,为此您需要启用缓冲/倒带。请参见Tratcher在此处的答案(更具体地说,请参见评论)https://dev59.com/CJjga4cB1Zd3GeqPEg3m#37842083 然后,您可以使用XmlDocument的“Load”方法自己解析流...但这将消耗更多的内存,具体取决于您的SOAP有效载荷的大小。 - Tseng
但需要注意的是,只有在从请求体中获取操作参数时才需要缓冲/倒带,因为请求流默认情况下是单向的(只能读取一次)。 - Tseng
3个回答

2
这是一个两部分的答案:
暴露ASP.NET Core中的SOAP服务:
微软目前不打算在ASP.NET Core中移植支持SOAP的服务,至少在不久的将来是这样的(请看这个SO答案,它也说明了同样的事情)。不过,没有什么阻止你使用普通的.NET Framework,该框架支持使用旧的ASMX或WCF来处理SOAP,至少是.NET Framework 4.5.x的一部分(在2023年结束支持)。
最后,如果SOAP对你只是一个技术要求,那么你可以构建一个薄的SOAP层只传递调用到你的主ASP.NET Core服务。唯一的限制是要支持在Linux上部署,因为完整的.NET Framework不能在Linux上本地运行;如果不需要在Linux上运行,那就没问题了。
在ASP.NET Core中消费SOAP服务:
ASP.NET Core通过使用WCF Connected services支持在ASP.NET Core中消费SOAP服务。

如果是这种情况,那么我们如何在分布式系统中集成不同的服务呢?我有一个客户端只能发送SOAP消息,还有一个下游系统只能接收SOAP格式的消息,而我们正在使用.NET Core构建中间件,那么这个集成将如何工作呢? - Sudama Tripathi
还想确认一下,如果使用 .Net Core 不可行的话,是否可以通过使用早期版本的 .Net(例如 Web API 2)构建的 Web API 端点来消费 SOAP 消息? - Sudama Tripathi
请将这段代码适当地添加到您的问题中,以便它易于阅读。 - Benjamin Soulier
这是我如何使用ASP MVC Web API消费SOAP消息并将其提取到对象中的方法 - https://stackoverflow.com/questions/27985639/is-it-possible-to-model-bind-a-soap-request-with-mvc/58254951#58254951 - JeeShen Lee
显示剩余3条评论

1
我知道这个问题已经得到了解答,但为了以后的参考,我也实现了类似Sudama的解决方案。
我有一个要求,需要消费来自Salesforce传输的SOAP消息,没有其他选项,所以我在.Net Core中实现了一个SOAP格式化程序,转换了传入的请求。
对于请求体的只读流,存在一些技术上的挑战,但如果你觉得有用的话,我在下面附上了项目代码链接:

https://github.com/TNDStudios/TNDStudios.Salesforce.OutboundReceiver


0
我通过实现自定义的输入和输出格式化程序解决了这个问题。这些格式化程序是简单的类,它们只需实现由.Net Core提供的IInputFormatter和IOutPutFormatter接口即可。使用上下文对象读取传入请求并将其序列化为您想要的格式(XML或JSON)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接