У меня есть клиентское приложение Windows и служба Windows, в которой размещается веб-служба через HTTPS (за ней используется стандартный http.sys). Все в порядке, кроме ситуации, когда пользователь ошибается и использует HTTP с портом HTTPS для доступа к сервису. Например, сервис выставлен на: https://somehost:9000
но пользователь неправильно устанавливает http://somehost:9000
.
Обычно, если конечная точка недоступна, клиент получает сообщение 404 Not found, но в этом случае конечная точка доступна, но хост сначала ожидает подтверждения SSL \ TLS. Когда клиент вызывает службу с использованием чистого HTTP, он зависает, и клиент ждет тайм-аутов. Более того, я обнаружил, что это какое-то глобальное поведение, потому что веб-службы, представленные в IIS через HTTPS, вызываемые через браузер с HTTP, ведут себя точно так же. Тайм-аут всегда равен 130 секундам. Keep-alive для соединений в IIS настроен на 120 секунд, поэтому он не выглядит коррелированным.
Какой тайм-аут используется в этом случае? Можно ли это изменить (вопрос немного абстрактный, потому что я еще не знаю, что хочу изменить)?
Я думаю, вы можете использовать модуль перезаписи URL, который вид прозрачный редирект на правильный протокол; вот некоторые детали
установите и включите перезапись URL-адреса и настройте виртуальный сайт ISS так, чтобы он не требовал-ssl, чтобы он мог обрабатывать HTTP-запрос и отправлять http-редирект обратно на https://
вот так
<rule name="HTTP to HTTPS redirect" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{HTTPS}" pattern="off" ignoreCase="true" />
</conditions>
<action type="Redirect" redirectType="Found" url="https://{HTTP_HOST}/{R:1}" />
</rule>
Эта стратегия лучше, чем внесение возможных критических изменений в общесистемные параметры TCP.
Альтернативой является установка соответствующих значений тайм-аута для компонента http.sys в вашем приложении. Некоторые значения и параметры по умолчанию упомянуты в этом документе здесь;