Получение 404 без ошибки прослушивания конечной точки WCF 4.0 с использованием Https basicHttpBinding по безопасности транспорта

Я пытаюсь настроить безопасность https для моей веб-службы wcf, размещенной в IIS 7.5. Я просмотрел каждую статью, которую смог найти в Интернете по этому поводу, и попробовал практически все конфигурации или уловки IIS, которые смог найти, или варианты. Я думаю, что это может быть проблема конфигурации IIS, уровня Windows. Мы используем сертификат SSL с подстановочными знаками, например * .mycompany.com. Этот сертификат используется на 3 других сайтах уже в том же IIS, если это имеет какое-либо значение. Кто-нибудь знает, с чем я здесь сталкиваюсь ??? Это общедоступный сервер, без TEST и http-привязки работает нормально. У меня такая же проблема https на моих серверах разработки и производства. У нас есть еще один https-сайт на этой производственной коробке, и он отлично отправляет и получает данные. Я получаю исключение:

На https://subdomain.mydomain.com/MyService.svc не было прослушивания конечной точки, которая могла бы принять сообщение. Часто это вызвано неправильным адресом или действием SOAP.

Внутреннее исключение:

Удаленный сервер возвратил ошибку: (404) Не найдено.

Вот мой web.config:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
   <appSettings file="LocalAppSettings.config">
      <!--<add key="CustomIISServiceHostEndPoint" value="https://subdomain.mydomain.com/MyService.svc" />-->
   </appSettings>
   <system.web>
      <compilation debug="true" targetFramework="4.0" />
      <customErrors mode="Off" />
  </system.web>
  <system.serviceModel>
      <bindings>
  <basicHttpBinding>
    <binding name="COLWebServiceBinding" maxReceivedMessageSize="134217727" sendTimeout="00:03:00" receiveTimeout="00:03:00">
        <security mode="Transport">
           <transport clientCredentialType="None" />
        </security>
        <readerQuotas maxArrayLength="65536" maxBytesPerRead="65536" maxStringContentLength="134217727" />
     </binding>
  </basicHttpBinding>
</bindings>
<services>
  <service behaviorConfiguration="COLWebService.ServiceBehavior" name="COLWebService">
    <endpoint address="https://subdomain.mydomain.com/MyService.svc"
              binding="basicHttpBinding"
              contract="MyCompany.COLWebService.ICOLWebService"
              bindingConfiguration="COLWebServiceBinding" />
    <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />
  </service>
</services>
<extensions>
  <behaviorExtensions>
    <add name="errorHandler" type="MyCompany.COLWebService.ErrorHandlerBehaviorExtensionElement, MyCompany.COLWebService" />
  </behaviorExtensions>
</extensions>
<behaviors>
  <serviceBehaviors>
    <behavior name="COLWebService.ServiceBehavior">
      <serviceMetadata httpsGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
    <!--<behavior name="">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>-->
  </serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="false">
</serviceHostingEnvironment>
 </system.serviceModel>
 <system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
  </system.webServer> 
 </configuration>

А вот и app.config моего клиента:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                 <binding name="wsHttpBinding_ICOLWebService" closeTimeout="00:01:00"
                openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:03:00"
                allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                maxBufferPoolSize="524288" maxReceivedMessageSize="134217727"
                messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true">
                      <readerQuotas maxStringContentLength="134217727" maxArrayLength="65536"
                    maxBytesPerRead="65536" />
                      <security mode="Transport">
                          <transport clientCredentialType="None" proxyCredentialType="None" />
                     </security>
                 </binding>
            </basicHttpBinding>
         </bindings>
        <client>
             <endpoint address="https://subdomain.mydomain.com/MyService.svc"
            binding="basicHttpBinding" bindingConfiguration="wsHttpBinding_ICOLWebService"
            contract="COLWebService.ICOLWebService" name="wsHttpBinding_ICOLWebServiceEP" />
          </client>
    </system.serviceModel>
  </configuration>

person kyleb    schedule 23.03.2012    source источник
comment
Вы пробовали просто открыть браузер и перейти по адресу svc? Я часто нахожу это гораздо более информативным, чем попытки работать с ошибками WCF.   -  person competent_tech    schedule 23.03.2012
comment
Да, если у меня есть только привязка https, кажется, что все нормально, но MEX отключен, хотя я включил MEXHttps в файле конфигурации. Но он должен работать с включенным mex или без него.   -  person kyleb    schedule 23.03.2012
comment
Я подумал, что это может быть потому, что я использовал пользовательский интерфейс для назначения подстановочного сертификата каждому сайту вместо использования командной строки. Нет, я удалил все привязки https со всех своих сайтов, а затем привязал их все к https, используя тот же сертификат подстановки, используя командную строку, как этот сайт сказал мне. sslshopper.com/article-ssl-host-headers- in-iis-7.html. Точно так же, как это приложение устанавливает сайт /site.name: ‹IISSiteName› /+bindings.[protocol='https',bindingInformation='*:443: ‹hostHeaderValue› ']   -  person kyleb    schedule 26.03.2012


Ответы (4)


Вы можете вручную добавить значения заголовка хоста в SSL-сертификаты, изменив файл applicationhost.config в system32 \ inetsrv. Найдите раздел для своего экземпляра IIS.

person user653649    schedule 23.03.2012

Откройте файл .svc - я бы предположил, что он не ссылается на COLWebService как на службу.

В вашем конфигурационном файле есть:

name="COLWebService"

в сервисной декларации. Это должно соответствовать именованной службе .SVC, которая, глядя на указанный вами URL-адрес, я думаю, будет «MyService».

person Chris    schedule 24.03.2012
comment
Я просто изменил названия вещей для публикации в Интернете. Это действительно совпадает, как вы сказали, я думаю, я все же дважды проверю. - person kyleb; 25.03.2012

Возможно, привязка https не была настроена для нового сайта.

В IIS выберите сайт, затем щелкните расширенные настройки и проверьте содержимое привязок. Убедитесь, что https есть в списке.

Изменить

Другое дело, что обработчик svc не активирован. Включен ли для сайта ASP.Net?

Вы должны сначала протестировать его без https, чтобы убедиться, что проблема связана с https.

Изменить 2

Убедитесь, что сайт запущен. Вы проверили, можете ли вы получить доступ к svc через браузер.

У вас на машине несколько сайтов, все используют https. Вы настроили заголовки хоста, чтобы разрешить всем сайтам использовать https? На этом сайте https находится на другом порту?

person Shiraz Bhaiji    schedule 23.03.2012
comment
Это запущено. Да. Он отображается в браузере, но в нем говорится, что Mex выключен, потому что у меня включена только привязка https mex, а не http. Но мне нужен только https. Да, все сайты используют https на этом сервере IIS с одним и тем же подстановочным сертификатом * .mycompany.com. Все они используют порт 443 для своего порта https. - person kyleb; 25.03.2012

Раздел вашей модели обслуживания должен быть таким

<system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" httpsGetUrl="/ssl"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
          <dataContractSerializer maxItemsInObjectGraph="6553600" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <bindings>
      <basicHttpBinding>
        <binding name="TransportSecurity" maxReceivedMessageSize="2147483647">
          <security mode="Transport">
            <transport clientCredentialType="None"/>
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <services>
      <service name="COLWebService.Service" behaviorConfiguration="">
        <endpoint address="/ssl" binding="basicHttpBinding" bindingConfiguration="TransportSecurity" contract="MyCompany.COLWebService.ICOLWebService"/>
        <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange"/>
      </service>
    </services>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>

И ваши клиенты будут получать доступ к сервису через https https://subdomain.mydomain.com/MyService.svc/ssl, через http то же самое, что и старый https://subdomain.mydomain.com/MyService.svc

person Özgür Kara    schedule 25.03.2012
comment
Зачем мне нужен / ssl для https? Почему они оба не могут использовать один и тот же адрес и просто изменить первую часть URL-адреса на http или https ??? Он должен просто автоматически обрабатывать это в IIS и отображать его для меня. - person kyleb; 26.03.2012
comment
Адреса конечных точек должны быть уникальными, поэтому адреса http и https должны быть разными msdn.microsoft. ru / en-us / library / ms733107.aspx. у меня это работает так, есть еще один пост, который вы, возможно, захотите увидеть stackoverflow.com/a/1989478/1175585 - person Özgür Kara; 26.03.2012
comment
Хм. Вы когда-нибудь пробовали просто использовать basicHttpBinding или wsHttpBinding с использованием режима безопасности Tranport вместо этой настраиваемой привязки с элементом узла HttpTransport? Также я хочу, чтобы эта служба была доступна только через https, а не через http. - person kyleb; 26.03.2012