Хорошо, я, должно быть, упускаю что-то совершенно простое здесь, потому что я гуглял несколько дней, и смотрел там десятки ответов, и здесь, на 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:// ...
РЕДАКТИРОВАТЬ: Я понял, что URL, указанный для svcutil в файле wsdl, на самом деле указывает на имя физического ящика веб-сервера, а не на соответствующий домен. Итак, я прошел шаги, показанные в этой публикации блога , чтобы обновить SecureBinding сайта в IIS с помощью сценария adsutil. Теперь файл 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>