Служба Windows Service размещала WCF поверх HTTPS
Я создал и настроил SSL-сертификат в соответствии с эти инструкции из MSDN. Я получаю сообщение об ошибке этот вопрос, но я не уверен, как сопоставить принятый ответ в этом вопросе с моим файлом App.config. Содержимое конфигурационного файла и самого сервиса работало корректно по http, а только по https, что проблема возникает.
Мой App.config
файл в настоящее время:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="TransportSecurity">
<security mode="Transport">
<transport clientCredentialType="None"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
<services>
<service name="LookupServiceHost" behaviorConfiguration="serviceBehaviour">
<host>
<baseAddresses>
<add baseAddress="https://localhost:54321/MyService"/>
</baseAddresses>
</host>
<endpoint address="" binding="wsHttpBinding" contract="ILookupService" bindingConfiguration="TransportSecurity" />
<endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="serviceBehaviour">
<serviceMetadata httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="False"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
Ошибка Исключение, возвращаемое в журнале событий Windows:
Служба не может быть запущена. System.ServiceModel.AddressAlreadyInUseException: HTTP не смог зарегистрировать URL https://+:54321/MyService/. Еще одно приложение уже зарегистрировало этот URL-адрес с помощью HTTP.SYS. --- > System.Net.HttpListenerException: Не удалось прослушать префикс 'https://+:54321/MyService/', поскольку он конфликтует с существующей регистрацией на машине.
Может ли кто-нибудь дать мне указатель относительно того, как включить это?
Ответы
Ответ 1
Я думаю, что вы подключаете две разные настройки. Netsh можно использовать для добавления сертификата для SSL, а также для того, чтобы приложение прослушивало данный порт без запуска под учетной записью администратора. Исключение составляет вторую настройку. Я не видел этого раньше, но я предполагаю, что вы уже зарегистрировали этот порт для HTTP, поэтому попробуйте использовать (и зарегистрировать) HTTPS на другом порту или заменить предыдущую регистрацию.
Edit:
Откройте командную строку с повышенными привилегиями (как Admin).
Сначала проверьте, назначен ли сертификат SSL правильному порту:
netsh http show sslcert
Затем проверьте, зарегистрировано ли прослушивание HTTP на этом порту, вызвав:
netsh http show urlacl
Если для этой регистрации используется следующая команда:
netsh http delete urlacl url=http://+:54321/MyService
Добавление регистрации снова для поддержки прослушивания на HTTPS:
netsh http add urlacl url=https://+:54321/MyService user=domain\userName
Если пользователь является учетной записью, используемой для запуска службы Windows. Если в локальной учетной записи используется только имя пользователя.
Примечание. Под https появляется символ-символ в urlacl. Мы не можем написать https://localhost:8733/...
для соответствия urlacl по умолчанию для Visual Studio для http. Это, вероятно, имеет смысл, поскольку запрошенное имя хоста недоступно до окончания дешифрования.
Ответ 2
По-разному кажущаяся причина, но тот же самый симптом, для других, кто находит там путь к этому сообщению.
Я запускал приложение, которое "всегда работало", и после различных (не регистрируемых с тех пор, как я не ожидал проблем) комбинаций запуска его через удаленный рабочий стол или локально, вход и выход и замену его перекомпилированным, но в противном случае идентичная версия с другим номером версии. Я получил то же самое. "Еще одно приложение уже зарегистрировало этот URL-адрес... blah, blah".
По-видимому (?) регистрация была специфичной для экземпляра, который выполнялся, и сохранялся при остановке этого приложения. (?) Во всяком случае, старая пословица Windows, "когда под сомнением перезагрузилась", позаботилась об этом. Без каких-либо изменений в самом приложении он работал без жалоб. Может быть, де-регистрация и т.д. Также сработала бы. Это было под Windows 10 - я никогда не видел этого с более ранними версиями Windows.