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


281

Я пытаюсь сделать службу 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 Имя параметра: через


4
На немецком языке сообщение об ошибке гласит: URI-схема Das bereitgestellte« https »ist ungültig; erwartet wurde« http » .
Уве Кейм

Ответы:


240

Попробуйте добавить учетные данные сообщения в ваш 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> 

35
Спасибо за этот ответ на ФП; У меня возникла та же проблема, и я изменил режим тега <security> со значения по умолчанию «Нет» на «Транспорт».
Отис

1
За исключением блока <message>, который по какой-то причине был отклонен IIS6, это работало хорошо.
Крис Чубб,

4
скопировал ту же конфигурацию в мой проект, но это ничего не дает. Я что-то пропустил, чтобы добавить?

1
Огромное спасибо. Я попробовал несколько решений, найденных в сети, но ни одно из них не сработало. Этот был идеальным.
aspnetdeveloper

59

Добавив это как ответ, просто потому что вы не можете сделать много необычного форматирования в комментариях.
У меня была та же проблема, за исключением того, что я создавал и привязывал свой клиент веб-сервиса полностью в коде.
Причина в том, что 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

Как вы создали классы для своего веб-сервиса?
kaiyaq

оно работает! У меня была такая же проблема в моем C #. Просто скопируйте пасту и проблема решена.
user3417479

@kaiyaq - я все еще могу подключиться к сервису для разработки со всеми стандартными вещами, позволяя VS создавать для меня классы, которые затем компилируются в DLL. Просто во время выполнения я не могу загрузить файл конфигурации со всей информацией о соединении.
Eidylon

BasicHttpBinding присутствует через использование System.ServiceModel; К вашему сведению будущие читатели.
DLeh

38

Меняться от

<security mode="None">

в

<security mode="Transport">

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


30

Вы запускаете это на 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" />

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


1
локальный IIS 7 с самоподписанным сертификатом
isg

13
«Кроме того, убедитесь, что вы изменили конфигурацию клиента для включения безопасности транспорта». -- Хороший совет. Слишком легко упустить из виду, и WCF не даст подсказок в своих ошибках.
Люк Пуплетт

недопустимо вести переговорыServiceCredential и УстановитьSecurityContext
Kiquenet

20

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

Я на самом деле добавляю ссылку на сервис из local WSDL файла. Он был успешно добавлен, и в файл конфигурации была добавлена ​​необходимая привязка. Однако, фактическое обслуживание было https; не http. Поэтому я изменил httpTransport Elemet как 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

19

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


У меня была точно такая же проблема, но у меня был неправильный пароль с использованием «Проверка подлинности имени пользователя / пароля». Оказывается, что если вы измените свой пароль, вам нужно нажать на URL-адрес службы и кнопку «Обновить» на панели инструментов, чтобы он мог его принять.
Райан Шиллингтон

12

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

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

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


5
Следует отметить, что basicHttpsBinding - 4.5 и новее.
Джагд

7

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

new WebHttpBinding(WebHttpSecurityMode.Transport)

Отлично. Я всегда ненавидел файлы .exe.config и вместо этого все делал по коду. Это решило мою проблему.
nivs1978

4

Полезно помнить, что файлы конфигурации можно разделить на дополнительные файлы, чтобы упростить изменение конфигурации на разных серверах (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

Чтобы перефразировать вопрос в ОП:

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

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

Учебные руководства WCFStorm решают эту проблему в разделе Работа с IIS и SSL .

Их решение сработало для меня:

  1. Чтобы исправить ошибку, создайте конфигурацию клиента, которая соответствует конфигурации службы wcf. Самый простой способ сделать это с помощью Visual Studio.

    • Откройте Visual Studio и добавьте ссылку на службу. VS сгенерирует файл app.config, соответствующий сервису

    • Отредактируйте файл app.config, чтобы он мог быть прочитан WCFStorm. Пожалуйста, смотрите раздел Загрузка клиентских файлов App.config . Убедитесь, что атрибуты конечной точки / @ name и endpoint / @ contract соответствуют значениям в wcfstorm.

  2. Загрузите измененный файл app.config в WCFStorm [используя кнопку toobar Client Config].

  3. Вызовите метод. На этот раз вызов метода больше не завершится ошибкой

Элемент (1) «последний действующий элемент» означает удаление префикса пространства имен, который VS добавляет к атрибуту контракта конечной точки, по умолчанию «ServiceReference1»

<endpoint ... contract="ServiceReference1.ListsService" ... />

поэтому в app.config, который вы загружаете в WCFStorm, вы хотите использовать ListsService:

<endpoint ... contract="ListsService" ... />

2

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

        <binding name="SI_PurchaseRequisition_ISBindingSSL">
          <security mode="Transport">
            <transport clientCredentialType="Basic" proxyCredentialType="None" realm="" />
          </security>
        </binding>

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.