Https с ошибкой WCF: "Не удалось найти базовый адрес, соответствующий схеме https"
Я перехожу к https://mywebsite/MyApp/Myservice.svc и получаю следующую ошибку:
(ссылка работает, если я использую http://)
"Служба" /MyApp/MyService.svc "не может быть активирована из-за исключения во время компиляции. Сообщение об исключении: Не удалось найти базовый адрес, который соответствует схеме https для конечной точки со связыванием BasicHttpBinding. [http].."
EDIT: Итак, если я изменю address=""
на address="https:// ..."
, тогда я получу эту ошибку:
"Ошибка: протокол https не поддерживается..... ChannelDispatcher в ' https://.../Annotation.svc' с контрактом (s )" Аннотации" не может открыть свой IChannelListener.
Вот что выглядит мой Web.Config
:
<services>
<service behaviorConfiguration="AnnotationWCF.AnnotationBehavior"
name="AnnotationWCF.Annotation">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_Annotation"
contract="AnnotationWCF.Annotation" />
<endpoint address=""
binding="basicHttpBinding" bindingConfiguration="SecureTransport"
contract="AnnotationWCF.Annotation" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_Annotation" maxBufferSize="2147483647"
maxReceivedMessageSize="2147483647">
<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
maxArrayLength="2147483647" maxBytesPerRead="2147483647"
maxNameTableCharCount="2147483647" />
</binding>
<binding name="SecureTransport" maxBufferSize="2147483647"
maxReceivedMessageSize="2147483647">
<security mode="Transport">
<transport clientCredentialType="None"/>
</security>
<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
maxArrayLength="2147483647" maxBytesPerRead="2147483647"
maxNameTableCharCount="2147483647" />
</binding>
</basicHttpBinding>
Ответы
Ответ 1
Оказалось, что моя проблема заключалась в том, что я использовал балансировщик нагрузки для обработки SSL, который затем отправил его через http на фактический сервер, который затем пожаловался.
Описание исправления находится здесь: http://blog.hackedbrain.com/2006/09/26/how-to-ssl-passthrough-with-wcf-or-transportwithmessagecredential-over-plain-http/
Изменить: я исправил свою проблему, которая была немного иной, после разговора с поддержкой Microsoft.
У моего приложения silverlight был свой адрес конечной точки в коде, переходящем https в балансировщик нагрузки. Затем балансировщик нагрузки изменил адрес конечной точки на http и указал на фактический сервер, на который он собирался. Поэтому в каждой конфигурации веб-сервера я добавил listenUri для конечной точки, которая была http, а не https
<endpoint address="" listenUri="http://[LOAD_BALANCER_ADDRESS]" ... />
Ответ 2
У меня была такая же проблема. Кроме моего решения было добавить "s" к значению привязки.
Старый:
связывание = "mexHttpBinding"
New:
связывание = "mexHttpsBinding"
фрагмент web.config:
<services>
<service behaviorConfiguration="ServiceBehavior" name="LIMS.UI.Web.WCFServices.Accessioning.QuickDataEntryService">
<endpoint behaviorConfiguration="AspNetAjaxBehavior" binding="webHttpBinding" bindingConfiguration="webBinding"
contract="LIMS.UI.Web.WCFServices.Accessioning.QuickDataEntryService" />
<endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />
</service>
Ответ 3
Убедитесь, что для вашего сервера включен SSL.
Я получил эту ошибку при попытке использовать файл конфигурации HTTPS в своем локальном поле, у которого нет этого сертификата. Я пытался выполнить локальное тестирование - путем преобразования некоторых привязок из HTTPS в HTTP. Я подумал, что было бы проще сделать это, чем попытаться установить самоподписанный сертификат для локального тестирования.
Оказалось, что я получал эту ошибку, потому что У меня не было SSL-поддержки на моем локальном IIS, хотя я и не собирался его использовать.
В конфигурации HTTPS есть что-то. Создание самоподписанного сертификата в IIS7 позволило HTTP затем работать: -)
Ответ 4
Я думаю, вы пытаетесь настроить свою службу аналогично следующей конфигурации. Здесь есть дополнительная информация: Укажите службу с двумя конечными точками, используя разные значения привязки. Кроме того, кроме разработки, вероятно, неплохо было бы иметь как конечные точки HTTP, так и HTTPS для одной и той же службы. Это своего рода поражение цели HTTPS. Надеюсь, это поможет!
<service type="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null">
<endpoint
address="http://computer:8080/Hello"
contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
binding="basicHttpBinding"
bindingConfiguration="shortTimeout"
</endpoint>
<endpoint
address="http://computer:8080/Hello"
contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
binding="basicHttpBinding"
bindingConfiguration="Secure"
</endpoint>
</service>
<bindings>
<basicHttpBinding
name="shortTimeout"
timeout="00:00:00:01"
/>
<basicHttpBinding
name="Secure">
<Security mode="Transport" />
</basicHttpBinding>
</bindings>
Ответ 5
В моем случае я устанавливаю режим безопасности на "TransportCredentialOnly" вместо "Transport" в привязке. Изменение этого параметра разрешило проблему
<bindings>
<webHttpBinding>
<binding name="webHttpSecure">
<security mode="Transport">
<transport clientCredentialType="Windows" ></transport>
</security>
</binding>
</webHttpBinding>
</bindings>
Ответ 6
Посмотрите на свой базовый адрес и адрес конечной точки (не можете увидеть его в своем примере кода). скорее всего, вы пропустили столбец или другую опечатку, например. https//вместо https://
Ответ 7
Я использовал webHttpBinding и забыл прописать режим безопасности "Транспорт" в конфигурации привязки, которая вызвала ошибку:
<webHttpBinding>
<binding name="MyWCFServiceEndpoint">
<security mode="Transport" />
</binding>
</webHttpBinding>
Добавление этого в конфигурацию устраняет проблему.