Предоставленная схема URI «https» недействительна; ожидаемый http Имя параметра: через - PullRequest
263 голосов
/ 12 марта 2010

Я пытаюсь сделать службу WCF через basicHttpBinding для использования через https. Вот мой web.config:

<!-- language: xml -->
<service behaviorConfiguration="MyServices.PingResultServiceBehavior"
         name="MyServices.PingResultService">
    <endpoint address="" 
              binding="basicHttpBinding" 
              bindingConfiguration="defaultBasicHttpBinding"
              contract="MyServices.IPingResultService">
        <identity>
            <dns value="localhost" />
        </identity>
    </endpoint>
    <endpoint address="mex" 
              binding="mexHttpBinding" 
              contract="IMetadataExchange" />
</service>
...
<bindings>
  <basicHttpBinding>
    <binding name="defaultBasicHttpBinding">
      <security mode="Transport">
        <transport clientCredentialType="None"/>
      </security>
    </binding>
  </basicHttpBinding>
</bindings>
...
<behaviors>
  <serviceBehaviors>
    <behavior name="MyServices.UpdateServiceBehavior">
      <serviceMetadata httpsGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
  </serviceBehaviors>
</behaviors>

Я подключаюсь с помощью WCFStorm, который способен правильно извлечь все метаданные, но когда я вызываю реальный метод, я получаю:

Предоставленная схема URI «https» недействительна; ожидаемый http Имя параметра: через

Ответы [ 12 ]

226 голосов
/ 15 марта 2010

Попробуйте добавить учетные данные сообщения в ваш app.config, например:

<bindings> 
<basicHttpBinding> 
<binding name="defaultBasicHttpBinding"> 
  <security mode="Transport"> 
    <transport clientCredentialType="None" proxyCredentialType="None" realm=""/> 
    <message clientCredentialType="Certificate" algorithmSuite="Default" />
  </security> 
</binding> 
</basicHttpBinding> 
</bindings> 
51 голосов
/ 15 января 2014

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

Вот код, который необходимо обновить для связи по SSL ...

Public Function GetWebserviceClient() As WebWorker.workerSoapClient
    Dim binding = New BasicHttpBinding()
    binding.Name = "WebWorkerSoap"
    binding.CloseTimeout = TimeSpan.FromMinutes(1)
    binding.OpenTimeout = TimeSpan.FromMinutes(1)
    binding.ReceiveTimeout = TimeSpan.FromMinutes(10)
    binding.SendTimeout = TimeSpan.FromMinutes(1)

    '// HERE'S THE IMPORTANT BIT FOR SSL
    binding.Security.Mode = BasicHttpSecurityMode.Transport

    Dim endpoint = New EndpointAddress("https://myurl/worker.asmx")

    Return New WebWorker.workerSoapClient(binding, endpoint)
End Function
30 голосов
/ 12 марта 2010

Вы используете это на Cassini (против сервера dev) или на IIS с установленным сертификатом? У меня были проблемы в прошлом, когда я пытался подключить безопасные конечные точки на веб-сервере dev.

Вот конфигурация привязки, которая работала для меня в прошлом. Вместо basicHttpBinding он использует wsHttpBinding. Я не знаю, если это проблема для вас.

<!-- Binding settings for HTTPS endpoint -->
<binding name="WsSecured">
    <security mode="Transport">
        <transport clientCredentialType="None" />
        <message clientCredentialType="None"
            negotiateServiceCredential="false"
            establishSecurityContext="false" />
    </security>
</binding>

и конечная точка

<endpoint address="..." binding="wsHttpBinding"
    bindingConfiguration="WsSecured" contract="IYourContract" />

Также убедитесь, что вы изменили конфигурацию клиента, чтобы включить безопасность транспорта.

28 голосов
/ 21 июля 2016

Изменение от

<security mode="None">

до

<security mode="Transport">

в вашем файле web.config. Это изменение позволит вам использовать https вместо http

20 голосов
/ 10 июня 2011

У меня была ТОЧНАЯ та же проблема, что и у ОП. Моя конфигурация и ситуация были идентичны. Я наконец сузил проблему до появления проблемы в WCFStorm после создания ссылки на службу в тестовом проекте в Visual Studio и подтверждения того, что служба работает. В Storm вам нужно нажать на опцию «Config» (НЕ «Client Config»). После этого нажмите вкладку «Безопасность» в появившемся диалоговом окне. Убедитесь, что для параметра «Тип проверки подлинности» установлено значение «Нет» (по умолчанию используется «Проверка подлинности Windows»). Престо, это работает! Я всегда тестирую свои методы в WCFStorm по мере их создания, но никогда не пытался использовать его для подключения к тому, который уже настроен на SSL. Надеюсь, это кому-нибудь поможет!

16 голосов
/ 06 декабря 2012

У меня было то же исключение в сценарии custom binding. Любой, кто использует этот подход, может проверить это тоже.

Я фактически добавляю ссылку на сервис из файла local WSDL. Он был успешно добавлен, и в конфигурационный файл была добавлена ​​необходимая привязка. Однако, фактическое обслуживание было https; не http. Поэтому я изменил элемент httpTransport на httpsTransport. Это решило проблему

<system.serviceModel>
<bindings>

  <customBinding>
    <binding name="MyBindingConfig">

      <textMessageEncoding maxReadPoolSize="64" maxWritePoolSize="16"
        messageVersion="Soap11" writeEncoding="utf-8">
        <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
          maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      </textMessageEncoding>

      <!--Manually changed httpTransport to httpsTransport-->
      <httpsTransport manualAddressing="false" maxBufferPoolSize="524288"
        maxReceivedMessageSize="65536" allowCookies="false" authenticationScheme="Anonymous"
        bypassProxyOnLocal="false" 
        decompressionEnabled="true" hostNameComparisonMode="StrongWildcard"
        keepAliveEnabled="true" maxBufferSize="65536" 
        proxyAuthenticationScheme="Anonymous"
        realm="" transferMode="Buffered" unsafeConnectionNtlmAuthentication="false"
        useDefaultWebProxy="true" />
    </binding>
  </customBinding>

</bindings>

<client>
  <endpoint address="https://mainservices-certint.mycompany.com/Services/HRTest"
    binding="customBinding" bindingConfiguration="MyBindingConfig"
    contract="HRTest.TestWebserviceManagerImpl" name="TestWebserviceManagerImpl" />
</client>


</system.serviceModel>

Ссылки

  1. WCF с привязкой по http и https
11 голосов
/ 26 июня 2013

Столкнулся с той же проблемой, вот как мое решение оказалось в конце:

        <basicHttpsBinding>
            <binding name="VerificationServicesPasswordBinding">
              <security mode="Transport">
              </security>
            </binding>
            <binding name="VerificationServicesPasswordBinding1" />
        </basicHttpsBinding>

Я в основном заменил каждое вхождение Http на Https. Вы можете попробовать добавить их оба, если хотите.

6 голосов
/ 27 апреля 2017

Если вы делаете это программно, а не в web.config, то его:

new WebHttpBinding(WebHttpSecurityMode.Transport)
3 голосов
/ 23 июня 2014

Полезно помнить, что файлы конфигурации можно разделить на дополнительные файлы, чтобы упростить изменение конфигурации на разных серверах (dev / demo / production и т. Д.) Без необходимости перекомпиляции кода / приложения и т. Д. Например, мы используем их, чтобы позволить инженерам на месте вносить изменения в конечную точку, фактически не затрагивая «настоящие» файлы.

Первый шаг - переместить раздел привязок из WPF App.Config в отдельный файл.

Секция поведения настроена так, чтобы разрешить как http, так и https (похоже, не влияет на приложение, если оба разрешены)

<serviceMetadata httpsGetEnabled="true" httpGetEnabled="true" />

И мы перемещаем секцию привязок в собственный файл;

 <bindings configSource="Bindings.config" /> 

В файле bindings.config мы переключаем безопасность на основе протокола

  <!-- None = http:// -->
  <!-- Transport = https:// -->
  <security mode="None" >

Теперь инженерам на сайте нужно только изменить файл Bindings.Config и Client.Config, где мы сохраняем фактический URL-адрес для каждой конечной точки.

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

Надеюсь, это поможет.

2 голосов
/ 10 января 2018

Мне понадобились следующие привязки, чтобы заставить мою работать:

        <binding name="SI_PurchaseRequisition_ISBindingSSL">
          <security mode="Transport">
            <transport clientCredentialType="Basic" proxyCredentialType="None" realm="" />
          </security>
        </binding>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...