我们有一个服务器,它有几种类型的api(基于httplistener的自定义XML API,基于WCF的SOAP API和基于WEB API的REST API)。我们希望将所有API移动到WEB API(有很多原因),它应该向后兼容。
支持url结构的原因之一:services / service1。服务/服务2。在这种情况下,它应该在一个端口上。它是分布在多个客户的Intranet应用程序,应该易于部署,安装。因此,我们不能在客户方(代理和其他方面)进行长时间配置。
在web api上实现SOAP服务有简单的方法吗?首先,应该很容易地将httprequest解析为打字的soap信封(基于现有合约)并序列化答案。当然,合同中有许多动作和数据类型。
PS:我不想看看servicestack :)
更新:
我上面描述的问题可以通过将http请求代理到soap服务来修复(它只能用于没有安全性的basichttpbinding。如果WCF服务需要NTLM身份验证,它将无法工作):
[HttpPost]
public async Task<IHttpActionResult> SoapAction()
{
var httpClient = new HttpClient();
var httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, "http://localhost:8111/soap")
{
Content = this.Request.Content
};
foreach (var header in this.Request.Headers)
{
httpRequestMessage.Headers.Add(header.Key, header.Value);
}
var responseMessage= await httpClient.SendAsync(httpRequestMessage).ConfigureAwait(false);
return ResponseMessage(responseMessage);
}
但我仍然想知道C#中是否有任何SOAP解析器,因为我的服务器支持NTLM身份验证。
我不建议混合使用这些技术。有一个用于SOAP Apis的项目和另一个用于WebApi的项目,共享相同的逻辑。
你有一个用于肥皂的网址,另一个用于webapi。
编辑:我根本不会做SOAP Parser。这是WCF的力量,并将继续使用它。
由于代理不是一个选项(可以在web.config中完成并且易于部署),我将创建一个WebAPI端点,该端点将重定向到SOAP API。
[HttpGet]
public IHttpActionResult Service1()
{
return Redirect("http://service.com/soap/services/service1");
}
稍后,在迁移逻辑时,请使用服务本身。
[HttpGet]
public IHttpActionResult Service1()
{
var result = new ServiceLogin1().Execute();
if(result == null)
{
return StatusCode(HttpStatusCode.NoContent);
}
else
{
return Ok();
}
}
我认为这已经在这里得到了回答ASP.NET WebAPI + Soap
如果您要求的是如何创建调用SOAP实现的REST包装器,那么像ServiceStack这样的库会为您执行此操作,但如果您想使用WebApi自行完成,则非常简单。只需创建一个单独的项目,其中包含您的SOAP服务引用,并将其包含在某种抽象中,然后在WebApi项目中引用它并从REST端点调用它。
如果您要问的是如何在WebApi中托管SOAP接口,我认为您只是为自己做了更多的工作。使用MS提供的WCF脚手架。 WebApi用于REST服务,WCF用于SOAP。