Skip to main content
 首页 » 编程设计

c#之如何在 WebAPI 上实现 SOAP 服务

2024年01月26日27TianFang

我们有一个服务器,它有几种类型的 api(基于 httplistener 的自定义 XML API、基于 WCF 的 SOAP API 和基于 WEB API 的 REST API)。我们希望将所有 API 移动到 WEB API(有很多原因)并且它应该向后兼容。

支持url结构的原因之一:services/service1。服务/服务2。在这种情况下,它应该在一个端口上。它是分发给多个客户的 Intranet 应用程序,应该易于部署、安装。因此,我们不能在客户端(代理和其他)进行长配置。

有没有简单的方法可以在 web api 上实现 SOAP 服务?乍一看应该是将 httprequest 解析为类型化的 soap 信封(基于现有契约(Contract))并序列化答案的简单方法。当然,合约中还有很多 Action 和数据类型。

PS:我不想研究服务栈:)

更新:

我上面描述的问题可以通过将 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,共享相同的逻辑。

然后您有一个用于 soap 的 url,另一个用于 webapi。

编辑: 我根本不会做 SOAP 解析器。这就是 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(); 
   } 
}