如何在WebAPI上实现SOAP服务

时间:2016-11-30 16:35:27

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

我们有一个服务器,它有几种类型的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身份验证。

2 个答案:

答案 0 :(得分:3)

我不建议混合使用这些技术。有一个用于SOAP Apis的项目和另一个用于WebApi的项目,共享相同的逻辑。

你有一个用于肥皂的网址,另一个用于webapi。

编辑: 我根本不会做SOAP Parser。这就是WCF的力量,并将继续使用它。

由于proxing不是一个选项(可以在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();
   }
}

答案 1 :(得分:3)

我认为这已在ASP.NET WebAPI + Soap

中得到解答

如果您要求的是如何创建调用SOAP实现的REST包装器,那么像ServiceStack这样的库会为您执行此操作,但如果您想使用WebApi自行完成,则非常简单。只需创建一个单独的项目,其中包含SOAP服务引用,并将其包含在某种抽象中,然后在WebApi项目中引用它,并从REST端点调用它。

如果您要问的是如何在WebApi中托管SOAP接口,我认为您只是为自己做了更多工作。使用MS提供的WCF脚手架。 WebApi用于REST服务,WCF用于SOAP。