Хорошо, мне, должно быть, здесь не хватает чего-то совершенно простого, потому что я много дней искал в Интернете и смотрел десятки ответов там, и здесь, на SO, и я просто НЕ МОГУ ПОЛУЧИТЬ это, несмотря ни на что, попробовал. Служба работает отлично, когда вызывается через простой HTTP.
Здесь наша настройка... у нас есть домен, http://www.mydomain.com. У нас есть SSL-сертификат, установленный в этом домене от thawte, как и мы, если бы мы обеспечивали сайт электронной коммерции. Все работает отлично, и я могу перейти на http s://www.mydomain.com, и он работает правильно. Я запускаю VS2008, сайт .NET 3.5 на Windows Server 2003 R2.
Теперь я добавил службу WCF с поддержкой Silverlight на свой сайт, с которой я хочу общаться через SSL. Если я перейду к http s://www.mydomain.com/myservice.svc, он покажет мне WSDL-описательную страницу Вы создали сервис, как и ожидалось, который показывает создание вашего клиента с помощью
svcutil.exe https:// ...
EDIT: Я понял, что url, показанный для svcutil в файле wsdl, фактически указывал на имя физического поля веб-сервера, а не на правильный домен. Поэтому я просмотрел шаги, показанные в этой публикации в блоге, чтобы обновить SecureBinding веб-сайта в IIS с помощью adsutil script. Теперь файл wsdl показывает правильный адрес SSL, но я все равно получаю ту же ошибку.
Теперь я пошел и попытался подключить к нему приложение Silverlight, и он не работает, возвращая исключение в результате асинхронных вызовов, указав ". Удаленный сервер возвратил ошибку: NotFound Несколько блогов, которые я прочитал, говорили о том, чтобы сузить его до проблем Silverlight, создав тестовое приложение Windows и попытавшись ссылаться на него. Ну, я сделал это и даже в обычном приложении Windows, пытающегося получить доступ к службы по SSL я получаю исключение:
System.ServiceModel.EndpointNotFoundException:
There was no endpoint listening at https://www.mydomain.com/mysubdir/myservice.svc that could accept the message.
This is often caused by an incorrect address or SOAP action.
See InnerException, if present, for more details. --->
System.Net.WebException: The remote server returned an error: (404) Not Found.
at System.Net.HttpWebRequest.GetResponse()
at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
Это несмотря на то, что я явно добавил ссылку на службу в приложение Windows с использованием схемы HTTPS, и она правильно получает все методы и показывает их в Intellisense в редакторе.
Обратите внимание, что это служба, которая НЕ требует явного входа в пользовательскую часть. Я собираюсь отправлять пользовательские заголовки в своих конвертах SOAP, чтобы проверить, что запросы поступают из нашего приложения, и я просто хочу, чтобы хищники не хватались за линию и не выбирали пользовательские заголовки.
Теперь к коду, где я должен просто немного глупо ошибиться, потому что из всего, что я прочитал, это должно быть довольно простое упражнение.
Во-первых, мой класс кода обслуживания по умолчанию украшен следующими атрибутами:
<ServiceBehavior(AddressFilterMode:=AddressFilterMode.Any)>
<AspNetCompatibilityRequirements(RequirementsMode:=AspNetCompatibilityRequirementsMode.Allowed)>
Раздел ServiceModel моего web.config на сервере выглядит так:
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="basicHttpBinding">
<security mode="Transport">
<transport clientCredentialType ="None"/>
</security>
</binding>
</basicHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="standingsBehavior">
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true">
<baseAddressPrefixFilters>
<add prefix="http://www.mydomain.com:80"/>
</baseAddressPrefixFilters>
</serviceHostingEnvironment>
<services>
<service behaviorConfiguration="standingsBehavior" name="lijslwebdata">
<endpoint address="" binding="basicHttpBinding" contract="lijslwebdata"/>
<!--<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>-->
</service>
</services>
</system.serviceModel>
И раздел ServiceModel приложения app.config в моем приложении Windows выглядит следующим образом:
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_lijslwebdata" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00"
sendTimeout="00:01:00" allowCookies="false"
bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize="65536" maxBufferPoolSize="524288"
maxReceivedMessageSize="65536" messageEncoding="Text"
textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192"
maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="Transport">
<transport clientCredentialType="None" proxyCredentialType="None" realm=""/>
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="https://www.mydomain.com/mysubdir/myservice.svc"
binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_lijslwebdata"
contract="xdata.lijslwebdata" name="BasicHttpBinding_lijslwebdata" />
</client>
</system.serviceModel>