Cómo obtener el nombre de dominio actual en ASP.NET

82

Quiero obtener el nombre de dominio actual en asp.net c #.

Estoy usando este código.

string DomainName = HttpContext.Current.Request.Url.Host;

Mi URL es, localhost:5858pero solo regresa localhost.

Ahora, estoy usando mi proyecto en localhost. Quiero obtener localhost: 5858.

Para otro ejemplo, cuando estoy usando este dominio

www.somedomainname.com

Quiero tener somedomainname.com

Por favor, dame una idea de cómo obtener el nombre de dominio actual.

Jatin Gadhiya
fuente
1
El nombre de host y el nombre de dominio son dos cosas diferentes. ¿Quiere un dominio que esté asignado a su dirección IP específica o al nombre de host de la máquina en la que se ejecuta?
Rob Goodwin
var base_url = "@ Request.Url.GetLeftPart (UriPartial.Authority) @ Url.Content (" ~ / ")"
Prince Prasad

Respuestas:

76

El uso Request.Url.Hostes apropiado: es la forma en que recupera el valor del Host:encabezado HTTP , que especifica qué nombre de host (nombre de dominio) quiere el UA (navegador), ya que la parte de la ruta de recursos de la solicitud HTTP no incluye el nombre de host.

Tenga en cuenta que localhost:5858no es un nombre de dominio, es un especificador de punto final, también conocido como "autoridad", que incluye el nombre de host y el número de puerto TCP. Esto se recupera accediendo Request.Uri.Authority.

Por otra parte, no es válida para obtener somedomain.coma partir www.somedomain.comdebido a que un servidor web puede ser configurado para servir a un sitio diferente para www.somedomain.comcomparación con somedomain.com, sin embargo, si está seguro de que esto es válido en su caso, entonces tendrá que analizar manualmente el nombre de host, aunque el uso de String.Split('.')obras en las una pizca.

Tenga en cuenta que la configuración del servidor web (IIS) es distinta de la configuración de ASP.NET, y que ASP.NET en realidad ignora por completo la configuración de enlace HTTP de los sitios web y las aplicaciones web en las que se ejecuta. El hecho de que tanto IIS como ASP.NET compartan los mismos archivos de configuración ( web.config) es una pista falsa.

Dai
fuente
113

Intente obtener la "parte izquierda" de la URL, así:

string domainName = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority);

Esto le dará bien http://localhost:5858o https://www.somedomainname.comsi usted está en local o de producción. Si desea eliminar la wwwpieza, debe configurar IIS para hacerlo, pero ese es otro tema.

Tenga en cuenta que la URL resultante no tendrá una barra al final.

Arturo Torres Sánchez
fuente
7
Esta debería ser la mejor respuesta en mi opinión.
Andrew
Esto funcionó de maravilla para mis necesidades. Sin embargo, una pequeña corrección: al solicitar la parte de Autoridad, la cadena devuelta no incluirá el delimitador de ruta final. Así:http://localhost:60333
Será el
1
var base_url = "@ Request.Url.GetLeftPart (UriPartial.Authority) @ Url.Content (" ~ / ")"
Prince Prasad
Esto no parece funcionar en Asp.Net Core 2.2. Obtengo que 'HttpContext' no contiene una definición para 'Actual' y no se puede encontrar un método de extensión accesible 'Actual' que acepte un primer argumento de tipo 'HttpContext' (¿le falta una directiva using o una referencia de ensamblaje?).
Stian
@Stian Aparentemente hay otra publicación que ya responde eso: stackoverflow.com/questions/31243068/… . Estas respuestas se centran solo en la parte URI.
Arturo Torres Sánchez
39

Aquí hay una captura de pantalla Request.RequestUriy todas sus propiedades para referencia de todos.

ingrese la descripción de la imagen aquí

ThiagoPXP
fuente
18

Puedes probar el siguiente código:

 Request.Url.Host +
    (Request.Url.IsDefaultPort ? "" : ":" + Request.Url.Port)
Rajeev Mehta
fuente
6

www.somedomain.com es el dominio / host. El subdominio es una parte importante. www.a menudo se usa indistintamente con no tener uno, pero eso debe configurarse como una regla (incluso si está configurado de forma predeterminada) porque no son equivalentes. Piense en otro subdominio, como mx.. Probablemente tenga un objetivo diferente al www..

Teniendo en cuenta eso, aconsejaría no hacer este tipo de cosas. Dicho esto, ya que estás preguntando, imagino que tienes una buena razón.

Personalmente, sugeriría una carcasa especial www.para esto.

string host = HttpContext.Current.Request.Url.GetComponents(UriComponents.HostAndPort, UriFormat.Unescaped);;

if (host.StartsWith("www."))
    return host.Substring(4);
else
    return host;

De lo contrario, si está realmente 100% seguro de que desea eliminar cualquier subdominio, necesitará algo un poco más complicado.

string host = ...;

int lastDot = host.LastIndexOf('.');

int secondToLastDot = host.Substring(0, lastDot).LastIndexOf('.');

if (secondToLastDot > -1)
    return host.Substring(secondToLastDot + 1);
else
    return host;

Conseguir el puerto es como han dicho otras personas.

Matthew Haugen
fuente
1

HttpContext.Current.Request.Url.Host está devolviendo los valores correctos. Si lo ejecuta en www.somedomainname.com, le dará www.somedomainname.com. Si desea obtener también el 5858, debe usar

HttpContext.Current.Request.Url.Port 
artm
fuente
1

el Request.ServerVariablesobjeto funciona para mí. No conozco ninguna razón para no usarlo.

ServerVariables["SERVER_NAME"]y ServerVariables["HTTP_URL"]debería conseguir lo que estás buscando

PJ Leirer
fuente
1

Puede probar el siguiente código para obtener un nombre de dominio completo:

Request.Url.Scheme + System.Uri.SchemeDelimiter + Request.Url.Host
Yogesh Patel
fuente
4
Si bien este fragmento de código puede resolver la pregunta, incluir una explicación realmente ayuda a mejorar la calidad de su publicación. Recuerde que está respondiendo la pregunta para los lectores en el futuro, y es posible que esas personas no conozcan los motivos de su sugerencia de código.
Dr. Rob Lang
1

A continuación, se muestra una forma rápida y sencilla de obtener el nombre de la URL.

            var urlHost = HttpContext.Current.Request.Url.Host;

            var xUrlHost = urlHost.Split('.');
            foreach(var thing in xUrlHost)
            {
                if(thing != "www" && thing != "com")
                {
                    urlHost = thing;
                }
            }
dstineback
fuente
0

Prueba esto:

@ Request.Url.GetLeftPart (UriPartial.Authority)

Hiren Patel
fuente
Esta respuesta no explica por qué funciona y, de hecho, es idéntica a una de las respuestas existentes.
Arturo Torres Sánchez
-1

Para obtener la URL base en MVC incluso con subdominio www.somedomain.com/subdomain:

var url = $"{Request.Url.GetLeftPart(UriPartial.Authority)}{Url.Content("~/")}";
Ivan-San
fuente