Почему Запрос [“размещает”] == “dev.testhost.com:1234” тогда как Запрос. URL. Хост == “localhost”

Привет все, я, кажется, нашел несоответствие при тестировании приложений 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" (поскольку я ожидал бы, что они оба будут).

Я НЕ обеспокоен, что второе значение включает номер порта, но я могущественный перепутанный относительно того, почему ИМЕНА ХОСТА полностью отличаются! Кто-либо знает, является ли это известной проблемой, или дизайном? Или я - идиот?!

Я использовал бы Request.Url.Host, так как это избегает необходимости разделять номер порта при тестировании... - Удаленный из-за возможного порождения беспорядка! - Sam

16
задан Sam Salisbury 21 December 2009 в 21:41
поделиться

3 ответа

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; .

9
ответ дан 30 November 2019 в 22:31
поделиться

Это вопрос того, что говорят спецификации w3 по сравнению с тем, что должно содержать свойство Microsoft Uri.Host . Название не подразумевает попытки MS предоставить идентичные функции. Функция, которая включает номера портов, - это Uri.Authority .

В опубликованном вами обновлении вы по-прежнему сталкиваетесь с той же проблемой, просто исследуя ее другой аспект. Свойство Uri.Host не является явным или подразумеваемым, чтобы выполнять ту же функцию, что и заголовки, определенные в спецификациях w3. В развернутой форме приведены некоторые цитаты со страницы MSDN Uri.Host:

Свойство Uri.Host
Получает компонент хоста этого экземпляра.

Значение свойства

Тип: System.String

Строка, содержащая имя хоста.

1
ответ дан 30 November 2019 в 22:31
поделиться

Request.Headers ["host"] - это хост, указанный в заголовке http из браузера. (например, это то, что вы увидите, если изучите трафик с помощью Fiddler или HttpWatch)

Однако ASP.NET загружает это (и другую информацию запроса) в экземпляр System.Uri , который анализирует строку запроса на составные части. В этом случае «Хост» означает буквально часть исходного запроса хост-машины (например, с портом tcp, находящимся в свойстве Port).

Этот класс System.Uri - очень полезный вспомогательный класс, который снимает всю боль при разделении вашего запроса на части, тогда как «Host:» (и в этом отношении «GET») из заголовка http - это просто необработанные данные запроса.

Хотя у них обоих одно и то же имя, они не должны быть одним и тем же.

8
ответ дан 30 November 2019 в 22:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: