Веб-служба WCF, возвращающая 404 через HTTPS, но работает через HTTP - PullRequest
0 голосов
/ 11 июля 2019

У меня есть веб-сервис, написанный много лет назад, который отлично работает через http.Он работает через веб-браузер, чтобы увидеть описание сервиса, и корректно реагирует на мыльные вызовы.Теперь мы хотим переместить его на https.

Я внес некоторые изменения в файл web.config, чтобы попытаться включить его для работы через https.Теперь я могу позвонить через https в браузере и посмотреть описание службы, но не могу вызвать веб-службу с помощью мыльного вызова через https - я получаю сообщение об ошибке 404.

Я проверяю мыльные вызовы с помощью Почтальонатак что, похоже, это указывает на то, что проблема связана либо с web.config, либо с IIS.

Я нашел много сообщений с проблемами, связанными с WCF через https, но пока не удалось решить эту проблему.Любая помощь будет принята с благодарностью.

Код службы из web.config показан ниже.

<system.serviceModel>
    <services>
  <service name="EComAPI" behaviorConfiguration="WCFAuthBehavior">
    <endpoint address="soap" binding="wsHttpBinding" contract="IEComAPI" bindingConfiguration="httpbinding1"></endpoint>
    <endpoint address="soap" binding="wsHttpBinding" contract="IEComAPI" bindingConfiguration="httpsbinding1"></endpoint>
    <endpoint address="rest" binding="webHttpBinding" contract="IEComAPI" behaviorConfiguration="rest" bindingConfiguration="httpbinding2"></endpoint>
    <endpoint address="rest" binding="webHttpBinding" contract="IEComAPI" behaviorConfiguration="rest" bindingConfiguration="httpsbinding2"></endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"></endpoint>
  </service>
</services>

    <bindings>
      <wsHttpBinding>
        <binding name="httpbinding1">
          <security mode="None"></security>
        </binding>
        <binding name="httpsbinding1">
          <security mode="Transport">
            <transport clientCredentialType="None"></transport>
          </security>
        </binding>
      </wsHttpBinding>

      <webHttpBinding>
        <binding name="httpbinding2">
          <security mode="None">
          </security>
        </binding>
        <binding name="httpsbinding2">
          <security mode="Transport">
            <transport clientCredentialType="None"></transport>
          </security>
        </binding>
      </webHttpBinding>
    </bindings>

    <behaviors>
      <serviceBehaviors>
        <behavior name="WCFAuthBehavior">
          <serviceMetadata httpsGetEnabled="false" httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
        <behavior name="">
          <serviceMetadata httpsGetEnabled="true" httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="rest">
          <webHttp />
        </behavior>
      </endpointBehaviors>
    </behaviors>
  </system.serviceModel>

В итоге:

  • http веб-запрос к этой службе- хорошо
  • http запрос к мылу на эту услугу - хорошо

  • https веб-запрос к этой услуге - хорошо

  • https мылоЗапрос на эту услугу - дает 404

1 Ответ

0 голосов
/ 12 июля 2019

Если мы хотим вызвать службу со стилем SOAP через HTTPS, мы должны использовать Wshttpbinding для публикации конечной точки службы и указать тип учетных данных клиента (значение по умолчанию - windows).

    <system.serviceModel>
      <services>
        <service name="VM1.MyService" behaviorConfiguration="mybehavior">
          <endpoint address="" binding="wsHttpBinding" contract="VM1.IService" bindingConfiguration="mybinding"></endpoint>
          <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange"></endpoint>
        </service>
      </services>
      <bindings>
        <wsHttpBinding>
          <binding name="mybinding">
            <security mode="Transport">
              <transport clientCredentialType="None"></transport>
            </security>
          </binding>
        </wsHttpBinding>
      </bindings>
      <behaviors>
        <serviceBehaviors>
          <behavior name="mybehavior">
            <serviceMetadata />
          </behavior>
        </serviceBehaviors>
      </behaviors>
</system.serviceModel>

Затем укажитеКонечная точка https в модуле привязки сайта IIS.
Если мы хотим опубликовать службу в стиле Restful, нам следует использовать WebHttpBinding.
https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/wcf-web-http-programming-model
Наконец, я создал похожую конфигурацию, которая поддерживает оба стиля SOAPи Restful style (требуется, чтобы добавить webget / webinvoke к методу операции), и он поддерживает как https, так и http.

<system.serviceModel>
      <services>
        <service name="VM1.MyService" behaviorConfiguration="mybehavior">
          <endpoint address="soap” binding="wsHttpBinding" contract="VM1.IService" bindingConfiguration="httpbinding1"></endpoint>
          <endpoint address="soap” binding="wsHttpBinding" contract="VM1.IService" bindingConfiguration="httpsbinding1"></endpoint>
          <endpoint address="rest” binding="webHttpBinding" contract="VM1.IService" behaviorConfiguration="rest" bindingConfiguration="httpbinding2"></endpoint>
          <endpoint address="rest” binding="webHttpBinding" contract="VM1.IService" behaviorConfiguration="rest" bindingConfiguration="httpsbinding2"></endpoint>
          <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" ></endpoint>
        </service>
      </services>
      <bindings>
        <wsHttpBinding>
          <binding name="httpbinding1">
            <security mode="None"></security>
          </binding>
          <binding name="httpsbinding1">
            <security mode="Transport">
              <transport clientCredentialType="None"></transport>
            </security>
          </binding>
        </wsHttpBinding>
        <webHttpBinding>
          <binding name="httpbinding2">
            <security mode="None">
            </security>
          </binding>
          <binding name="httpsbinding2">
            <security mode="Transport">
              <transport clientCredentialType="None"></transport>
            </security>
          </binding>
        </webHttpBinding>
      </bindings>
      <behaviors>
        <serviceBehaviors>
          <behavior name="mybehavior">
            <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          </behavior>
        </serviceBehaviors>
        <endpointBehaviors>
          <behavior name="rest">
            <webHttp />
          </behavior>
        </endpointBehaviors>
      </behaviors>
    </system.serviceModel>

Пожалуйста, не забудьте указать базовый адрес Http и Https в привязке сайта IISМодуль при условии, что мы размещаем службу в IIS.
Не стесняйтесь, дайте мне знать, если есть что-то, с чем я могу помочь.

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