Автономное приложение HttpListener работает в 2008 году, не работает в 2012 году
У меня есть отдельное приложение, которое использует HttpListener, который отлично работает на Server 2008, но с треском проваливается в 2012 году. Каждый раз, когда я пытаюсь подключиться, я получаю несколько вариантов:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD><TITLE>Bad Request</TITLE>
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
<BODY><h2>Bad Request - Invalid Hostname</h2>
<hr><p>HTTP Error 400. The request hostname is invalid.</p>
</BODY></HTML>
Когда я подключаюсь к порту прослушивателя из командной строки на этом компьютере, он работает нормально (я получаю ожидаемый ответ).
Брандмауэр настроен правильно, и я даже попробовал его с отключенным брандмауэром.
Я пробовал почти все возможные комбинации netsh http add urlacl
мыслимые, в том числе:
http://+:n/ (n = port number)
http://*:n/
http://127.0.0.1:n/
http://localhost:n/
http://public_ip_address:n/
Я также пытался получить доступ к каждому из этих имен хостов.
Также с различными пользовательскими комбинациями:
user=everyone
user=hostname\administrator
Я пробовал их по отдельности, а также пытался без какой-либо из них настроен.
Результат тот же, но ответ отскакивает между 503 и 400 (тот же самый корпус ответа, что и выше).
IIS НЕ работает на этой машине. Нет конфликтов портов. Каждая машина имеет новую установку только с этим приложением.
О том, чтобы сорвать волосы с моей головы.
1 ответ
Видимо, есть некоторые вещи, которые не разъяснены с netsh http add urlacl
и использование жестких и мягких подстановочных знаков "+" и "*".
Я решил проблему, и то, что, кажется, происходит, состоит в следующем:
- Записи urlacl проверяются и сравниваются с заголовком HTTP Host
- символы + и * работают только для IP-адресов и имен, которые известны компьютеру
- то есть подстановочные знаки + и * НЕ будут работать для общедоступных IP-адресов или DNS-имен, которые не известны машине
Поэтому, если у вас есть машина, которая находится в локальной сети и доступна через Интернет, вам, возможно, придется настроить явные записи urlacl для публичного IP-адреса и публичных DNS-имен, которые будут использоваться.
Действительно, очень раздражает. Надеюсь, это сэкономит кому-то время.