Привет все, я, кажется, нашел несоответствие при тестировании приложений ASP.NET локально на встроенном веб-сервере с Visual Studio 2008 (Кассини).
Я настроил хост на своей локальной машине, связывающей dev.testhost.com с 127.0.0.1, так как у меня есть приложение, которое должно измениться, его появление в зависимости от заголовка хоста раньше называло ее.
Однако, когда я запрашиваю свое использование тестового приложения http://dev.testhost.com:1234/index.aspx
, значение Request.Url.Host
всегда "localhost"
. Принимая во внимание, что значение Request.Headers["host"]
"dev.testhost.com:1234"
(поскольку я ожидал бы, что они оба будут).
Я НЕ обеспокоен, что второе значение включает номер порта, но я могущественный перепутанный относительно того, почему ИМЕНА ХОСТА полностью отличаются! Кто-либо знает, является ли это известной проблемой, или дизайном? Или я - идиот?!
Я использовал бы - Удаленный из-за возможного порождения беспорядка! - SamRequest.Url.Host
, так как это избегает необходимости разделять номер порта при тестировании...
Request.Headers ["host"]
- это значение, полученное от приложения, которое подключается к серверу, а другое значение - это значение, которое получает сервер, когда он пытается получить доменное имя.
Браузер использует в запросе введенное доменное имя, поскольку оно используется в случае виртуальных доменов. Сервер сообщает о том, какой установлен в настройках сервера, или о первом найденном.
РЕДАКТИРОВАТЬ: Посмотрев на код Cassini, чтобы увидеть, использует ли он какие-то конкретные настройки, я заметил следующий код:
public string RootUrl {
get {
if (_port != 80) {
return "http://localhost:" + _port + _virtualPath;
}
else {
return "http://localhost" + _virtualPath;
}
}
}
//
// Socket listening
//
public void Start() {
try {
_socket = CreateSocketBindAndListen(AddressFamily.InterNetwork, IPAddress.Loopback, _port);
}
catch {
_socket = CreateSocketBindAndListen(AddressFamily.InterNetworkV6, IPAddress.IPv6Loopback, _port);
}
// …
}
Объяснение, похоже, состоит в том, что Cassini явно ссылается на localhost и не пытается выполнить обратный поиск в DNS. В противном случае он не будет использовать return "http: // localhost" + _virtualPath;
.
Это вопрос того, что говорят спецификации w3 по сравнению с тем, что должно содержать свойство Microsoft Uri.Host . Название не подразумевает попытки MS предоставить идентичные функции. Функция, которая включает номера портов, - это Uri.Authority .
В опубликованном вами обновлении вы по-прежнему сталкиваетесь с той же проблемой, просто исследуя ее другой аспект. Свойство Uri.Host не является явным или подразумеваемым, чтобы выполнять ту же функцию, что и заголовки, определенные в спецификациях w3. В развернутой форме приведены некоторые цитаты со страницы MSDN Uri.Host:
Свойство Uri.Host
Получает компонент хоста этого экземпляра.Значение свойства
Тип: System.String
Строка, содержащая имя хоста.
Request.Headers ["host"]
- это хост, указанный в заголовке http из браузера. (например, это то, что вы увидите, если изучите трафик с помощью Fiddler или HttpWatch)
Однако ASP.NET загружает это (и другую информацию запроса) в экземпляр System.Uri
, который анализирует строку запроса на составные части. В этом случае «Хост» означает буквально часть исходного запроса хост-машины (например, с портом tcp, находящимся в свойстве Port).
Этот класс System.Uri
- очень полезный вспомогательный класс, который снимает всю боль при разделении вашего запроса на части, тогда как «Host:» (и в этом отношении «GET») из заголовка http - это просто необработанные данные запроса.
Хотя у них обоих одно и то же имя, они не должны быть одним и тем же.