【问题标题】:How to implement SOAP service on WebAPI如何在 WebAPI 上实现 SOAP 服务
【发布时间】:2019-04-25 22:03:33
【问题描述】:

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

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

有没有简单的方法在 web api 上实现 SOAP 服务?乍一看应该很容易将 httprequest 解析为键入的肥皂信封(基于现有合同)并序列化答案。当然,合约中有很多动作和数据类型。

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 身份验证。

【问题讨论】:

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


    【解决方案1】:

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

    然后你有一个用于soap的url,另一个用于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();
       }
    }
    

    【讨论】:

    • 我们希望有相同的 url 结构:services/service1。服务/服务2。在这种情况下,它应该在一个端口上。它是分发给多个客户的 Intranet 应用程序,应该易于部署、安装。因此,我们不能在客户端(代理和其他)进行长时间配置。当然,我们可以创建一个内部代理。但是普通的肥皂解析器看起来更好。 PS:我无法编辑该评论。
    • @Andection 更新答案。我真的不喜欢解析器。对我来说,这是两倍的工作和麻烦。
    • 感谢您的重定向建议。但看起来它不起作用。客户端收到错误请求:S​​ystem.ServiceModel.ProtocolException:远程服务器返回了意外响应:(400)错误请求。 ---> System.Net.WebException:远程服务器返回错误:(400)错误请求。在 System.Net.HttpWebRequest.GetResponse() 在 System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
    【解决方案2】:

    我认为这里已经回答了ASP.NET WebAPI + Soap

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

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

    【讨论】:

    • 第一个选项(我在我的问题中提到了它)不适合我。我应该支持需要直接 TCP/IP 连接的 NTLM 身份验证。
    猜你喜欢
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多