WCF SOAP через HTTPS, тестовый клиент WCF вызывает http-адрес, и сервер отвечает 404

#wcf #iis #soap #https

#wcf #iis #soap #https

Вопрос:

Версия TL; DR находится внизу.

Я создал три веб-службы WCF — одну, использующую .NET 4, и две, использующие .NET 3.5, — которые используются клиентом Android. Клиент Android выполняет вызовы с использованием ksoap2-android. Когда службы были завершены, и клиент мог совершать все вызовы и получать все данные от служб, мы решили активировать HTTPS-связь для веб-служб. Они размещены на сервере под управлением IIS.

Я не одинок в этой задаче. Я работаю с ним полный рабочий день, в основном с клиентом Android. У меня есть два сотрудника, у обоих из которых много других обязанностей. Первый в основном задействован в службах, а второй в основном задействован на сервере.

Я прочитал много руководств, блогов и статей в Интернете о том, как включить HTTPS для веб-службы WCF, но до сих пор я не смог полностью решить эту проблему. Чтобы клиент Android мог использовать клиент, мы ограничены использованием BasicHttpBinding, поскольку wsHttpBinding содержит некоторые сведения о безопасности, которые не поддерживаются Android, или что-то в этом роде. Я не уверен, но я где-то читал это на каком-то форуме. Если я ошибаюсь, я бы с радостью исправился!

Хорошо, итак, я дам краткий отчет о том, что я сделал до сих пор:

Я включил безопасность транспорта, вот как выглядит привязка (привязки):

 <bindings>
  <basicHttpBinding>
    <binding name="basicHttp" closeTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00">
      <security mode="Transport">
        <transport clientCredentialType="None" />
      </security>
    </binding>
  </basicHttpBinding>
</bindings>
  

Я включил публикацию метаданных через HTTPS, используя эту строку кода:

 <serviceMetadata httpsGetEnabled="true" />
  

и это:

 <endpoint address="" binding="mexHttpsBinding" contract="IMetadataExchange" />
  

Кроме того, мой второй коллега установил доверенный сертификат (реальный сертификат от центра сертификации) на сервере IIS и добавил привязку https на сервере.

Хорошо, пока все хорошо. Теперь мы могли подключаться к службам в браузере.

Когда мы это сделали, стало возможным посещать службу в браузере безопасным, зашифрованным способом.

Проблема в том, что невозможно выполнить вызов службы ни в Android, ни в тестовом клиенте WCF. Если я вызываю службу по адресу https, я получаю 404 в ответ. Тестовый клиент WCF возвращает это:

 There was no endpoint listening at https://[my service address] that could accept the message. This is often caused by an incorrect address or SOAP action.
  

Чтобы иметь возможность отлаживать это, я использую Wireshark для перехвата сообщений и просмотра того, что происходит на самом деле. Я обнаружил, что после установленных процедур (рукопожатие, установление доверия и т. Д.) Клиент Отправляет заголовок и получает 101 Continue в ответ, после чего он отправляет тело. Это должно быть нормальным поведением. Но затем служба возвращает 404 Not Found . Wireshark сообщает, что полный URI запроса — это http-адрес. Я настроил сервер на использование https-адреса, так почему же он выполняет вызов http-адреса?

Я попытался установить для атрибута address и listenUri конечной точки значения https и http соответственно и наоборот. Если я это сделаю, сервер ответит на запрос с помощью метода 405, который не разрешен.

Есть ли какой-нибудь способ решить эту проблему? Чего мне не хватает?

Чего мне не хватает?

TL; версия DR ниже

Я размещаю три веб-службы WCF SOAP с помощью IIS, одна из которых использует .NET 4, а другие — .NET 3.5. Я пытаюсь выполнить вызов из тестового клиента WCF через HTTPS. Я включил безопасность транспорта, публикацию метаданных через HTTPS, установил доверенный сертификат и добавил привязку https на сервере.

Когда я пытаюсь выполнить вызов из тестового клиента WCF, он сообщает, что по адресу не было прослушивания конечной точки. Wireshark сообщает мне, что он вызывает http-версию службы (т. Е. «http: // [мой адрес]» вместо «https: // [мой адрес]»), хотя он настроен на вызов https-адреса. Служба возвращает 404 Не найдено. Если я установлю адрес службы на https, а listenUri — на http, я получу, что метод 405 не разрешен. Если я сделаю это наоборот, он скажет, что он не может быть активирован. Чего мне не хватает?

Ответ №1:

Я решил это, удалив конечную точку и используя <protocolMapping> тег, например:

 <protocolMapping>
  <add scheme="https" binding="basicHttpBinding" bindingConfiguration="basicHttps" />
</protocolMapping>