#c# #asp.net #wcf #ssl
#c# #asp.net #wcf #ssl
Вопрос:
У нас есть веб-служба WCF, которая, к сожалению, должна использовать SOAP 1.1 SSL, поэтому я использую BasicHttpBinding, а не wsHttpBinding. Я считаю, что мой web.config в порядке, поскольку я сравнил его с бесчисленными другими в статьях stackoverflow и MSDN. Мне не повезло с другими решениями проблемы, потому что, похоже, все используют wsHttpBinding для всех примеров привязки SSL.
Многие предложения по StackOverflow приводят к ошибкам конфигурации сервера, таким как заголовки SSL, но я подтвердил людям, которые управляют нашим IIS, что привязки портов SSL и заголовки хостов SSL настроены правильно (насколько мы можем судить). Однако мы используем подстановочный сертификат, который, как я читал, может усложнить этот процесс, как в этом (удален из-за нового ограничения пользователя на ссылки), хотя мой SSL работает, и сеанс зашифрован.
Я надеюсь, что в конфигурации есть что-то простое, чего мне не хватает, потому что я смотрел на это слишком много часов / дней подряд.
Когда я пытаюсь вызвать службу из WcfTestService.exe или базовое приложение .net, я получаю следующую ошибку.
На https:// subdomain.domain.us:8091/SalesService/SalesService.svc не было прослушиваемой конечной точки, которая могла бы принять сообщение. Это часто вызвано неправильным адресом или действием SOAP. Смотрите InnerException, если оно присутствует, для получения более подробной информации.
Трассировка стека сервера:
в системе.ServiceModel.Каналы.HttpChannelUtilities.ProcessGetResponseWebException (WebException WebException, запрос HttpWebRequest, прерывание запроса HttpAbortReason) в системе.ServiceModel.Каналы.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.Ожидание восстановления (тайм-аут временного интервала) в системе.ServiceModel.Каналы.Канал запроса.Запрос (сообщение Message, тайм-аут TimeSpan) в системе.ServiceModel.Диспетчер.RequestChannelBinder.Запрос (сообщение Message, тайм-аут TimeSpan) в системе.ServiceModel.Каналы.ServiceChannel.Вызов (строковое действие, логический oneway, операция ProxyOperationRuntime, вход объекта [], выход объекта [], тайм-аут TimeSpan) в системе.ServiceModel.Каналы.ServiceChannelProxy.Вызов службы (IMethodCallMessage MethodCall, операция ProxyOperationRuntime) в системе.ServiceModel.Каналы.ServiceChannelProxy.Вызов (сообщение iMessage)Исключение повторно установлено в [0]:
в System.Runtime.Удаленное подключение.Прокси.RealProxy.Обработчик возвращает сообщение (iMessage reqMsg, iMessage retMsg) в System.Runtime.Удаленное подключение.Прокси.RealProxy.PrivateInvoke (MessageData amp; msgData, тип Int32) в IServiceRC.RestrictedProduct(строка line1) в ServiceRCClient.RestrictedProduct(строка line1)Внутреннее исключение: удаленный сервер вернул ошибку: (404) Не найдено. в System.Net.HttpWebRequest.GetResponse() в System.ServiceModel.Каналы.HttpChannelFactory.HttpRequestChannel.Запрос HttpChannelRequest.WaitForReply (время ожидания)
И вот мой web.config
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="SalesService.ServiceRCbehavior">
<!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
<serviceMetadata httpsGetEnabled="true"/>
<!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<basicHttpBinding>
<binding name="ServiceRCbind" closeTimeout="00:01:00" openTimeout="00:01:00"
receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false"
bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="Transport">
<transport clientCredentialType="None"/>
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address=""
binding="basicHttpBinding" bindingConfiguration="ServiceRCbind"
contract="SalesService.IServiceRC"/>
</client>
<services>
<service behaviorConfiguration="SalesService.ServiceRCbehavior" name="SalesService.ServiceRC">
<endpoint address="" listenUri="SalesService.svc" binding="basicHttpBinding" contract="SalesService.IServiceRC" bindingConfiguration="ServiceRCbind"/>
<endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange"/>
<host>
<baseAddresses>
<add baseAddress="https://subdomain.domain.us:8091/SalesService/"/>
</baseAddresses>
</host>
</service>
</services>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true">
<baseAddressPrefixFilters>
<!--<add prefix="https://subdomain.domain.us:8091/SalesService/"/>-->
</baseAddressPrefixFilters>
</serviceHostingEnvironment>
</system.serviceModel>
Еще одна вещь, которую я рассмотрел, — это создание пользовательских конечных точек, как в ранее связанном решении, но я не думаю, что моя ситуация конкретно требует этого и только усложнит ситуацию.
Любые входные данные / ссылки были бы чрезвычайно оценены.
Редактировать: Здесь приведена ссылка на текст wsdl, сгенерированный IIS (отредактировано только доменное имя для анонимности)
Комментарии:
1. При просмотре файла .svc в браузере отображается правильный URL-адрес, когда говорится, что использовать SvcUtil.exe для создания прокси?
2. Проверяли ли вы или кто-либо другой, настроен ли на сайте службы / приложении HTTPS для использования порта 8091 в IIS? Порт HTTPS по умолчанию равен 443. Когда IIS сообщает 404, это обычно означает, что путь URL каким-то образом неверен. Кроме того, удалось ли какому-либо клиенту вызвать службу или успешно получить от нее WSDL?
3. Да, Нейт, он показывает правильный URL, и когда я использую SvcUtil.exe он правильно извлекает всю информацию и генерирует служебные и выходные файлы. Сиксто, HTTPS привязан к 8091, и при просмотре файла svc браузер сообщает, что SSL активен и соединение зашифровано, поэтому я предполагаю, что все это правильно. Я смог вызвать WSDL с помощью WCFTestClient.exe и он отключил все методы и их соответствующие входные параметры.
4. Будет ли публикация файла WSDL кому-либо полезна? Тем не менее, все там выглядит довольно стандартно.
5. было бы здорово, если бы вы могли опубликовать файл WSDL. Пожалуйста, отправьте WSDL, просмотренный из IIS, не для службы, размещенной на сервере веб-разработки VS.