【问题标题】:How to POST a SOAP message on web api (asp.net core ->web api)如何在 web api (asp.net core -> web api) 上发布 SOAP 消息
【发布时间】:2016-09-15 09:24:04
【问题描述】:

我想将基于 SOAP XML 的消息发布到我在 ASP.NET 核心项目模板中创建的 Web API。

现在,当我使用内容类型作为应用程序/soap+xml 进行发布时,我收到了不受支持的媒体类型错误。

我知道我们应该将 SOAP 消息发送到基于 WCF 的服务,但我们的要求只是这样。我应该能够在 Web API 中使用 SOPA 消息。

谢谢, 苏达玛

【问题讨论】:

  • 您将如何从不理解 SOAP 的服务中使用 SOAP?没有明智的方法将 WebAPI 转换为 SOAP。您必须使用 WCF 服务,别无他法,这意味着使用完整的 .NET 框架。 WebAPI 是 REST Api,而不是 SOAP
  • 我使用下面的代码来发布 SOAP 消息并检索基本上是 xml 的主体,现在我正在尝试反序列化它,但缺少错误根元素,否则我似乎找到了解决方法[HttpPost]公共查找帖子([FromBody] XmlDocument xmlDocument){var soapBody = xmlDocument.GetElementsByTagName("soap12:Body")[0];字符串 innerObject = soapBody.InnerXml; XmlSerializer deserializer = new XmlSerializer(typeof(Find));使用 (TextReader reader = new StreamReader(innerObject)) { return (Find)deserializer.Deserialize(reader); } }
  • 您当然可以从请求正文中读取有效负载。但为此,您需要启用缓冲/倒带。请参阅 Tratcher 的答案(更具体的 cmets)stackoverflow.com/a/37842083/455493 然后您可以使用 XmlDocument 的 Load 方法自己解析流...但这会消耗更多内存,具体取决于您的肥皂有效负载的大小跨度>
  • 但这里要注意,如果你也从body中获取action参数,你只需要缓冲/倒带,因为请求流默认是转发的(只能读取一次)跨度>

标签: c# soap asp.net-web-api asp.net-core


【解决方案1】:

这是一个由两部分组成的答案:

使用 ASP.NET Core 公开 SOAP 服务:

  • Microsoft不考虑在 ASP.NET Core 中移植支持 SOAP 的服务,近期内不会(请参阅 this other SO answer,其中声明相同)。

  • 话虽如此,没有什么能阻止您使用普通的 .NET Framework,它支持使用旧的 ASMXWCF 的 SOAP至少是 .NET Framework 4.5.x 的一部分(支持ending in 2023)。

  • 最后,SOAP 对您来说似乎只是一项技术要求,因此您可以构建一个瘦 SOAP 层,只需将调用转移到您的主 ASP.NET Core 服务。 p>

唯一的限制是支持在 Linux 上部署它,完整的 .NET Framework 不能在其上原生运行;如果没有,你很高兴。

使用 SOAP 服务赢得 ASP.NET Core:

ASP.NET Core 支持通过使用 WCF Connected servicesASP.NET Core 中使用 SOAP 服务。

【讨论】:

  • 如果是这种情况,那么我们将如何在分布式系统中集成不同的服务?我有一个只能发送soap消息的客户端,还有一个只能接收soap格式消息的下游系统,还有一个我们正在使用.NET核心构建的中间件,那么这种集成将如何工作?跨度>
  • 还想检查 .net 核心是否不可能通过使用早期版本的 .Net(例如 web API 2)构建的 web api 端点使用 SOAP 消息?
  • 请将此代码正确回答您的问题,以便它可读
  • 请参考此链接forums.asp.net/p/2103699/…
  • 你走的路似乎有点太复杂了......通过手动解析xml,如果调用者需要你的SOAP端点可靠/安全,你将如何确保任何WS-* specification?跨度>
【解决方案2】:

我知道这已得到解答,但为了将来参考,我还实施了与 Sudama 类似的解决方案。

我需要使用从 Salesforce 传输的 SOAP 消息,没有其他选项可用,因此我在 .Net Core 中实现了一个 SOAP 格式化程序,它转换了传入的请求。

请求正文的一次性读取流存在一些技术挑战,但如果您觉得它有用,我在下面提供了指向项目代码的链接:

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

【讨论】:

    【解决方案3】:

    我通过实现自定义 Input & OutPut 格式化程序解决了这个问题。这些格式化程序是简单的类,它们只是实现了 .Net 核心提供的 IInputFormatter 和 IOutPutFormatter。使用上下文对象读取传入的请求并以您想要的格式(xml 或 Json)将它们序列化。

    【讨论】:

      猜你喜欢
      • 2017-07-05
      • 2018-06-29
      • 2017-01-16
      • 2018-10-26
      • 2017-10-11
      • 2018-02-28
      • 2019-08-06
      • 1970-01-01
      • 2012-09-12
      相关资源
      最近更新 更多