c# asp.net visual-studio debugging cassini

c# - ¿Por qué Request["host"]== "dev.testhost.com:1234" mientras que Request.Url.Host== "localhost"



asp.net visual-studio (3)

Hola a todos, parece que he encontrado una discrepancia al probar aplicaciones ASP.NET localmente en el servidor web incorporado con Visual Studio 2008 (Cassini).

He configurado un host en mi máquina local asociando dev.testhost.com con 127.0.0.1 , ya que tengo una aplicación que necesita cambiar su apariencia según el encabezado del host que se utilice para llamarla.

Sin embargo, cuando solicito mi aplicación de prueba utilizando http://dev.testhost.com:1234/index.aspx , el valor de Request.Url.Host siempre es "localhost" . Mientras que el valor de Request.Headers["host"] es "dev.testhost.com:1234" (como es de esperar que ambos sean).

¡NO me preocupa que el segundo valor incluya el número de puerto, pero estoy muy confundido de por qué los NOMBRES DE HOST son completamente diferentes ! ¿Alguien sabe si se trata de un problema conocido o por diseño? ¿O estoy siendo un idiota?

Prefiero usar Request.Url.Host , ya que eso evita tener que eliminar el número de puerto al realizar la prueba ... - ¡ Eliminado debido a la posibilidad de confusión! - Sam


Es una cuestión de lo que dicen las especificaciones de w3 y lo que se supone que debe contener la propiedad Microsoft Uri.Host . La denominación no implica un intento por parte de MS de proporcionar una funcionalidad idéntica. La función que incluye los números de puerto es Uri.Authority .

Con la actualización que publicaste, sigues enfrentando el mismo problema, solo examina un aspecto diferente. La Uri.Host no se establece explícitamente o implícitamente para realizar la misma función que los encabezados que se definen en las especificaciones de w3. En formato largo, aquí hay algunas citas de la página de MSDN de Uri.Host:

Propiedad Uri.Host
Obtiene el componente host de esta instancia.

Valor de propiedad

Tipo: System.String

Una cadena que contiene el nombre de host. Este suele ser el nombre de host DNS o la dirección IP del servidor.

No hay garantía de que esto coincida con lo que está en los encabezados, solo que representa el nombre del host de alguna forma.


The Request.Headers["host"] es el host especificado en el encabezado http desde el navegador. (por ejemplo, esto es lo que vería si examinara el tráfico con Fiddler o HttpWatch)

Sin embargo, ASP.NET carga esto (y otra información de solicitud) en una instancia de System.Uri , que analiza la cadena de solicitud en sus partes constituyentes. En este caso, "Host" se refiere literalmente a la parte de la máquina host de la solicitud original (por ejemplo, con el puerto tcp en el puerto) de la propiedad.

Esta clase de System.Uri es una clase de ayuda muy útil que elimina toda la molestia de dividir su solicitud en sus partes, mientras que el "Host:" (y, para el caso, el "GET") del encabezado http son datos de solicitud sin procesar. .

Aunque ambos tienen el mismo nombre, no están destinados a ser la misma cosa.


Request.Headers["host"] es el valor recibido de la aplicación que se conecta al servidor, mientras que el otro valor es el que obtiene el servidor cuando intenta obtener el nombre de dominio.

El navegador usa en la solicitud el nombre de dominio ingresado porque se usa en el caso de dominios virtuales. El servidor informa del conjunto en las preferencias del servidor, o el primero que encuentra.

EDITAR: Mirando el código de Cassini para ver si usa alguna configuración en particular, noté el siguiente código:

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

La explicación parece ser que Cassini hace referencia explícita a localhost y no intenta realizar una búsqueda de DNS inversa. De manera diferente, no usaría return "http://localhost" + _virtualPath; .