#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>