2016-11-30 2 views
0

У нас есть сервер, который имеет несколько типов api (пользовательский XML-API на основе httplistener, SOAP API на основе WCF и REST API на основе WEB API). Мы хотим переместить все API в WEB API (есть много причин), и он должен быть обратно совместимым.Как реализовать SOAP-сервис на WebAPI

Одна из причин поддержки структуры URL: services/service1. услуги/service2. И в этом случае он должен быть на одном порту. Это приложение для интрасети, которое распространяется среди нескольких клиентов, и его следует легко развернуть, установить. Таким образом, мы не можем иметь длинную конфигурацию на стороне клиента (прокси и другие).

Есть ли простой способ для реализации SOAP-сервиса на веб-api? На первый взгляд должен быть простой способ проанализировать httprequest, чтобы набрать мыльный конверт (на основе существующего контракта) и сериализовать ответ. Конечно, в контракте много действий и типов данных.

PS: Я не хочу смотреть в servicestack :)

Update:

Проблема, которую я описал выше, может быть решена proxing запрос HTTP на мыло службы (Он может работать только с 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); 
    } 

Но я все еще хочу знать, есть ли SOAP анализатор в C#, потому что мой сервер поддерживает аутентификацию NTLM.

ответ

2

Я бы не рекомендовал смешивать технологии. У вас есть один проект для SOAP Apis и еще один для WebApi, который использует одну и ту же логику.

У вас есть один 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(); 
    } 
} 
+0

Мы хотим иметь такую ​​же структуру URL: services/service1. услуги/service2. И в этом случае он должен быть на одном порту. Это приложение для интрасети, которое распространяется среди нескольких клиентов, и его следует легко развернуть, установить. Таким образом, мы не можем иметь длинную конфигурацию на стороне клиента (прокси и другие). Конечно, мы можем создать внутренний прокси.Но нормальный мыльный парсер выглядит лучше. PS: Я не могу отредактировать этот комментарий. – Andection

+0

Все API, конечно, разделяют одну и ту же логику ... – Andection

+0

@Andection Обновите ответ. Я действительно не поклонник парсеров. Для меня это в два раза больше работы и неприятностей. – jaimetotal

1

Я думаю, что это уже ответил здесь ASP.NET WebAPI + Soap

Если то, что вы просите, как создать REST оберток, которые вызывают в реализации SOAP затем библиотеки как ServiceStack сделать это для вас, но если вы хотите сделайте это самостоятельно с помощью WebApi, это довольно просто. Просто создайте отдельный проект, в котором есть ссылки на SOAP-службы, которые были обернуты какой-то абстракцией, а затем ссылаются на этот проект в вашем проекте WebApi и вызывают его из ваших конечных точек REST.

Если вы спрашиваете, как разместить интерфейсы SOAP в WebApi, я думаю, вы просто делаете больше работы для себя. Используйте леса WCF, предоставленные MS. WebApi для служб REST, WCF для SOAP.

+0

Первый вариант (я udated его в мой вопрос) не подходит для меня. Я должен поддерживать аутентификацию NTLM, для которой требуется прямое соединение TCP/IP. – Andection

Смежные вопросы