Почему Request ["host"] == "dev.testhost.com:1234", а Request.Url.Host == "localhost" - PullRequest
16 голосов
/ 21 декабря 2009

Привет всем. Кажется, я обнаружил несоответствие при локальном тестировании приложений ASP.NET на встроенном веб-сервере с помощью Visual Studio 2008 (Cassini).

Я установил хост на своем локальном компьютере, связывая 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" (как и следовало ожидать, они оба будут).

Я НЕ обеспокоен тем, что второе значение включает номер порта, , но я сильно озадачен тем, почему HOST NAMES полностью отличаются ! Кто-нибудь знает, если это известная проблема или по замыслу? Или я идиот?!

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

Ответы [ 3 ]

9 голосов
/ 21 декабря 2009

Request.Headers["host"] - это значение, полученное от приложения, которое подключается к серверу, а другое значение - это значение, которое сервер получает, когда пытается получить имя домена.

Браузер использует в запросе введенное имя домена, поскольку оно используется в случае виртуальных доменов. Сервер сообщает о том, что установлено в настройках сервера, или о первом, которое он находит.

РЕДАКТИРОВАТЬ: Глядя на код Кассини, чтобы увидеть, использует ли он какие-то конкретные настройки, я заметил следующий код:

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);
  }
  // …
}

Похоже, что объяснение состоит в том, что Кассини делает явную ссылку на localhost и не пытается сделать обратный поиск DNS. Иными словами, он не будет использовать return "http://localhost" + _virtualPath;.

8 голосов
/ 21 декабря 2009

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

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

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

Хотя они оба имеют одно и то же имя, они не должны быть одинаковыми.

1 голос
/ 21 декабря 2009

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

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

Uri.Host Property
Получает компонент узла этого экземпляра.

Стоимость недвижимости

Тип: System.String

Строка, содержащая имя хоста. Обычно это имя хоста DNS или IP-адрес сервера.

Нет гарантии, что это будет соответствовать тому, что находится в заголовках, только то, что оно представляет имя хоста в некоторой форме.

...