Я разработал и опубликовал службу WCF, размещенную в облачной службе Azure (классическая версия). Я установил сертификат и настроил облачный сервис на использование сертификата. Это сертификат, приобретенный в ЦС, а не самозаверяющий сертификат. Сначала я подозревал некоторые проблемы с сертификатом, но, как указывает Стеффен в своем комментарии, похоже, что это не так. Я могу отправить запрос POST через HTTP и получить ответ 200. Но если я пытаюсь отправить запрос POST через HTTPS, я получаю ответ 404. Это единственная разница между двумя запросами. Использование HTTPS обязательно.
Я настроил IIS для отправки подробных сообщений об ошибках как для локальных, так и для удаленных вызовов, но я по-прежнему не получаю информации, кроме базового 404. Не найдено.
Здесь приведены разделы привязок и конечных точек из файла определения сервиса (.csdef).
<Bindings>
<Binding name="HttpsIn" endpointName="HttpsIn" />
<Binding name="Endpoint1" endpointName="Endpoint1" />
</Bindings>
<Endpoints>
<InputEndpoint name="HttpsIn" protocol="https" port="443" certificate="mycertificate" />
<InputEndpoint name="Endpoint1" protocol="http" port="80" />
</Endpoints>
А вот раздел привязок из файла web.config:
<bindings>
<basicHttpBinding>
<binding name="HttpsIn">
<security mode="Transport"></security>
</binding>
</basicHttpBinding>
</bindings>
Это работает, возвращая ответ 200:
POST http://mydomain/myservice.svc HTTP/1.1
User-Agent: Fiddler
Host: mydomain
Content-Length: 600
Content-Type: text/xml; charset=utf-8
SOAPAction: "myclass/myaction"
<?xml version="1.0" etc, etc
Это не удается, возвращая ответ 404:
POST https://mydomain/myservice.svc HTTP/1.1
User-Agent: Fiddler
Host: mydomain
Content-Length: 600
Content-Type: text/xml; charset=utf-8
SOAPAction: "myclass/myaction"
<?xml version="1.0" etc, etc
Ответ:
HTTP/1.1 404 Not Found
Server: Microsoft-IIS/10.0
X-Powered-By: ASP.NET
Date: Thu, 20 Jun 2019 09:40:02 GMT
Content-Length: 0
Я попытался внести изменения, предложенные Авраамом Куианом ниже. Мой сервисный конфиг был в основном таким, как указано Авраамом, за исключением того, что у него не было атрибута aspNetCompatibilityEnabled или раздела protocolMapping, поэтому я добавил их. Моя привязка IIS была, как указано Авраамом, но использовала определенный IP-адрес, а не «Все назначенные», поэтому я также внес это изменение. После этих изменений я получил исключение при активации службы. Сообщение об ошибке указывало на проблему с атрибутом aspNetCompatibilityEnabled, поэтому я снова удалил ее. Теперь я получал сервис 503, недоступный, при попытке удаленного просмотра сайта, но смог войти на сайт при входе на сервер. Похоже, что это может быть проблема с IP-адресом, поэтому я изменил привязку IIS, чтобы снова использовать определенный IP-адрес. Сейчас я вернулся к тому, с чего начал - сервис работает через http, но я получаю 404 при попытке вызвать его через https.
Подводя итог, я могу отобразить WSDL в браузере (mydomain / myservice.svc? Wsdl), используя HTTP или HTTPS. Я могу вызвать метод действия SOAP, используя GET, используя HTTP или HTTPS. Это, конечно, не возвращает желаемый результат, потому что метод должен вызываться с использованием POST, но он возвращает содержимое страницы «вы создали службу». 404 происходит только с комбинацией HTTPS и POST.
HTTP + GET = 200,
HTTPS + GET = 200,
HTTP + POST = 200,
HTTPS + POST = 404.