WCF SOAP через HTTPS, WCF Test Client вызывает http-адрес, а сервер отвечает 404 - PullRequest
0 голосов
/ 07 октября 2011

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" />

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

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

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

Проблема в том, чтоневозможно позвонить в службу, ни в Android, ни в WCF Test Client.Если я позвоню в службу по адресу 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://[my address]» вместо «https://[my address]»), хотя он настроен для вызова https-адреса.Служба возвращает 404 Not Found.Если я установлю адрес службы на https и listenUri на http, я получу метод 405 Not Allowed.Если я делаю это наоборот, он говорит, что его нельзя активировать.Чего мне не хватает?

1 Ответ

0 голосов
/ 13 октября 2011

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

<protocolMapping>
  <add scheme="https" binding="basicHttpBinding" bindingConfiguration="basicHttps" />
</protocolMapping>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...