WebAPI支持SOAP吗?我正在尝试在MVC4中编写一个SOAP服务器,虽然我可以在WCF中完成,但似乎WebAPI正在替换它,但我还没有找到使用SOAP的方法,目前只看到了使用REST风格接口的JSON / XML。
WebAPI支持SOAP吗?我正在尝试在MVC4中编写一个SOAP服务器,虽然我可以在WCF中完成,但似乎WebAPI正在替换它,但我还没有找到使用SOAP的方法,目前只看到了使用REST风格接口的JSON / XML。
引用Scott Guthrie的话:过去几年中,我们见证了Web API的崛起 - 这些API是通过普通HTTP公开的服务,而不是通过更正式的服务协议(如SOAP或WS *)。
所以我会说不。
我建议您考虑使用ServiceStack,它可以支持REST和SOAP API。不过需要注意的是,由于SOAP只能通过HTTP POST工作,因此有一些限制。
与SOAP相比,ServiceStack提供了更好的替代方案,可以使用ServiceStackVS内置的Add ServiceStack Reference功能从URL生成类型化API,这是WCF的Add Service Reference所没有的。
这是对ServiceStack的基于消息的设计的证明,它提供了众多优势,包括能够支持同一服务的多个终端和格式,如REST、SOAP和MQ终端,以及生成服务器端或客户端HTML网站(如果需要的话)。以下是一个丰富的Northwind数据库编辑器的示例,因为它是使用ServiceStack构建的,所以自动启用了一个类型化的REST API,可以通过原生桌面客户端、移动应用程序和单页应用程序进行调用。
IReturn<T>
标记上指定响应类型,以便客户端也能获得类型化的 API。 - mythzWeb API 是微软对基于 REST 的 API 的回应。如果您需要 SOAP,请选择 WCF。
我不能说我知道所有的区别,但他们声称的WebAPI方法中存在的问题,我可以通过经验证实确实存在-API演化(在真正的项目中不可避免)在Web API中相当棘手。当然,Web API不支持SOAP。
虽然Web API不直接支持SOAP,但由于SOAP只是使用XML并通过HTTP传输的标准,您可以使用Web API公开POST服务来读取XML,并使用XPath查找所需节点,然后将节点反序列化为对象。
首先,您需要将XML支持添加到ConfigureServices中。
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));
}