[英]ASP.NET WebAPI + Soap
WebAPI是否支持SOAP? 我正在尝试在MVC4中编写SOAP服务器,虽然我可以在WCF中执行它,但似乎WebAPI正在替换它,但我认为没有办法在此使用SOAP,只使用REST Style接口的JSON / XML。
引用Scott Guthrie的话:过去几年看到了Web API的兴起 - 通过普通的HTTP而不是通过更正式的服务契约(如SOAP或WS *)暴露的服务。
所以我会说不。
WEB API是微软对基于REST的apis的回答。 如果您需要SOAP,请使用WCF。
你应该考虑使用ServiceStack ,它允许你的同一个服务支持REST + SOAP API,虽然因为SOAP只适用于HTTP POST,所以它有一些限制
作为SOAP的替代方案,ServiceStack提供了WCF的添加服务引用的更好替代方案,该方法可以使用内置于ServiceStackVS中的Add ServiceStack Reference功能从URL生成类型化API。
有趣的是,尽管WebAPI ApiController方法在使用C#RPC方法创建和定义繁琐的Web服务时采用了与WCF相同的RPC方法 ,但它们仍然无法支持由同一公司制作的自己的SOAP标准。
这是ServiceStack 基于消息的设计的一个证明,它提供了许多优势,不能承受相同的服务支持多种端点和格式,包括REST,SOAP和MQ端点,以及生成服务器端或客户端HTML网站,如果你需要它。 这是一个丰富的Northwind数据库编辑器的示例,因为它是使用ServiceStack构建的,它自动启用了一个类型化的REST API,可以使用丰富的本机桌面客户端,移动应用程序和单页面应用程序调用它们。
尽管尽管支持SOAP具有互操作性,可访问性和向后兼容性的原因,但我们并不建议将其用于构建Web服务平台,因为它不一定是复杂,脆弱,缓慢和冗长的,并且有更好的替代方法可供使用。 我在InfoQ的采访中详细解释了一下 。
事实上,WebApi并不支持开箱即用的SOAP。 但它是一个非常灵活的框架,您可以“适应”它来处理SOAP:没有什么可以阻止您手动解析收到的SOAP消息(毕竟它们是纯XML)并手动生成响应作为XML字符串,然后发送它们与适当的内容类型标题(您甚至可以为此编写自己的内容格式化程序 )。
根据您的需求和现有的代码库,这可能是值得的,或者您可能希望使用更加SOAP等技术,例如WCF或已经提到的ServiceStack框架。
您可能希望查看ServiceStack ,它应该在一个界面中同时支持SOAP和REST,而不会有任何麻烦。 它声称比WebAPI更适合Web服务 。
我不能声称知道关于差异的一切,但他们声称的问题是我从经验中可以说的Web API方法中固有的问题是真实的 - 在Web api中,API演变(在实际项目中不可避免)是相当棘手的。 当然,web api不支持SOAP。
它不像Wed API支持SOAP,但是由于SOAP只是一个使用XML的标准,它运行抛出HTTP,您可以使用Web API公开POST服务以读取XML并使用XPath查找所需的节点,然后反序列化节点到对象。
首先,您需要向ConfigureServices添加XML支持
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
.AddXmlSerializerFormatters();
}
然后在您的控制器中,您只需要添加一个接收XMLDocument的方法,并使用XPath搜索您感兴趣的节点(基本上删除soap信封,标题,正文),然后您可以反序列化该对象。 在我的例子中,我使用WSDL添加服务引用,然后我反序列化该对象。
[HttpPost("reservationxml")]
public void CreateReservationFromTSW(XmlDocument soapCreateReservationRq)
{
XmlNamespaceManager nsmgr = new XmlNamespaceManager(soapCreateReservationRq.NameTable);
nsmgr.AddNamespace("r", "http://soa.company.com/ReservationEnt");
nsmgr.AddNamespace("s", "http://www.w3.org/2003/05/soap-envelope");
XmlNodeList xmlNodeList = soapCreateReservationRq.SelectNodes("s:Envelope/s:Body/r:CreateReservationRq",nsmgr);
XmlNode xmlnode = xmlNodeList[0];
XmlSerializer serial = new XmlSerializer(typeof(ServiceReference1.CreateReservationRqType));
ServiceReference1.CreateReservationRqType rq = (ServiceReference1.CreateReservationRqType)serial.Deserialize(new XmlNodeReader(xmlnode));
}
正如您在下一张图片中看到的那样,尝试使用您的服务的服务使用带有Accept-Encoding的请求方法POST:gzip。 这就是为什么您可以公开可以为SOAP服务使用的Web API的原因。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.