我们有一个服务器,它有几种类型的 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();
}
}
关于c# - 如何在 WebAPI 上实现 SOAP 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40893529/