Служба WCF работает с HTTP, но не с HTTPS - PullRequest
0 голосов
/ 19 июня 2019

Я разработал и опубликовал службу 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.

1 Ответ

0 голосов
/ 21 июня 2019

Дружище, похоже, что-то не так с процессом публикации сервиса через https.
Пожалуйста, используйте следующую конфигурацию, чтобы включить https и http.
Конфигурация сервера.

  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpsGetEnabled="true" httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
    <protocolMapping>
      <add scheme="https" binding="basicHttpsBinding"/>
      <add scheme="http" binding="basicHttpBinding"/>
    </protocolMapping>
  </system.serviceModel>

Затем мы добавляем привязку http и https в модуль привязки сайтов IIS.
Связывание сайтов IIS enter image description here
Следует отметить одну вещьчто служба не является Restful, она просто работает в сообщении SOAP.Мы могли бы вызвать его с помощью клиентского прокси.Как показано ниже.
Клиентская сторона.

ServiceReference1.Service1Client client = new ServiceReference1.Service1Client("BasicHttpsBinding_IService1");
            try
            {
                var result = client.GetData(34);
                Console.WriteLine(result);
            }
            catch (Exception)
            {
                throw;
            }

Конфигурация клиента.

    <system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="BasicHttpBinding_IService1" />
            <binding name="BasicHttpsBinding_IService1">
                <security mode="Transport" />
            </binding>
        </basicHttpBinding>
    </bindings>
    <client>
        <endpoint address="http://vabqia969vm:11000/Service1.svc" binding="basicHttpBinding"
            bindingConfiguration="BasicHttpBinding_IService1" contract="ServiceReference1.IService1"
            name="BasicHttpBinding_IService1" />
        <endpoint address="https://vabqia969vm:11001/Service1.svc" binding="basicHttpBinding"
            bindingConfiguration="BasicHttpsBinding_IService1" contract="ServiceReference1.IService1"
            name="BasicHttpsBinding_IService1" />
    </client>
</system.serviceModel>

Приведенный выше класс прокси клиента (service1client) создается путем добавления ссылки на службув моем проекте.
Не стесняйтесь, дайте мне знать, если есть что-то, с чем я могу помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...