Domanda

Mi chiedo quale sia il modo migliore per ottenere il dominio corrente in ASP.NET?

Ad esempio:

http://www.nomedominio.com/sottodir/ dovrebbe cedere http://www.nomedominio.com http://www.sub.nomedominio.com/subdir/ dovrebbe cedere http://sub.nomedominio.com

Come guida, dovrei essere in grado di aggiungere un URL come "/Folder/Content/filename.html" (ad esempio come generato da Url.RouteUrl() in ASP.NET MVC) direttamente sull'URL e dovrebbe funzionare.

È stato utile?

Soluzione

Stessa risposta di MattMitchell ma con qualche modifica.Questo controlla invece la porta predefinita.

Modificare:Sintassi e utilizzo aggiornati Request.Url.Authority come suggerito

$"{Request.Url.Scheme}{System.Uri.SchemeDelimiter}{Request.Url.Authority}"

Altri suggerimenti

Come da questo link un buon punto di partenza è:

Request.Url.Scheme + System.Uri.SchemeDelimiter + Request.Url.Host 

Tuttavia, se il dominio è http://www.nomedominio.com:500 questo fallirà.

Qualcosa di simile al seguente è tentato di risolvere questo problema:

int defaultPort = Request.IsSecureConnection ? 443 : 80;
Request.Url.Scheme + System.Uri.SchemeDelimiter + Request.Url.Host 
  + (Request.Url.Port != defaultPort ? ":" + Request.Url.Port : "");

Tuttavia, le porte 80 e 443 dipenderanno dalla configurazione.

In quanto tale, dovresti usare IsDefaultPort come nel Risposta accettata sopra da Carlos Muñoz.

Request.Url.GetLeftPart(UriPartial.Authority)

Questo è lo schema incluso.

AVVERTIMENTO! A chiunque lo usi Richiesta.attuale.Url.Host.Comprendi che stai lavorando in base alla RICHIESTA CORRENTE e che la richiesta corrente non sarà SEMPRE con il tuo server e talvolta può essere con altri server.

Quindi, se lo usi in qualcosa come Application_BeginRequest() in Global.asax, il 99,9% delle volte andrà bene, ma lo 0,1% potresti ottenere qualcosa di diverso dal nome host del tuo server.

Un buon esempio di ciò è qualcosa che ho scoperto non molto tempo fa.Il mio server tende a bloccarsi http://proxyjudge1.proxyfire.net/fastenv di volta in volta.Application_BeginRequest() gestisce volentieri questa richiesta, quindi se chiami Request.Url.Host mentre effettua questa richiesta otterrai proxyjudge1.proxyfire.net.Alcuni di voi potrebbero pensare "no duh", ma vale la pena notare perché è stato un bug molto difficile da notare poiché si è verificato solo lo 0,1% delle volte:P

Questo bug mi ha costretto a inserire il mio host di dominio come stringa nei file di configurazione.

Perché non usarlo

Request.Url.Authority

Restituisce l'intero dominio E la porta.

Devi ancora capire http o https

Semplice E corto modo (supporta schema, dominio e porta):

Utilizzo Request.GetFullDomain()

// Add this class to your project
public static class HttpRequestExtensions{
    public static string GetFullDomain(this HttpRequestBase request)
    {
        var uri= request?.UrlReferrer;
        if (uri== null)
            return string.Empty;
        return uri.Scheme + Uri.SchemeDelimiter + uri.Authority;
    }
}

// Now Use it like this:
Request.GetFullDomain();
// Example output:    https://www.example.com:5031
// Example output:    http://www.example.com:5031
// Example output:    https://www.example.com

Un altro modo:


string domain;
Uri url = HttpContext.Current.Request.Url;
domain= url.AbsoluteUri.Replace(url.PathAndQuery, string.Empty);

Che ne dite di:

NameValueCollection vars = HttpContext.Current.Request.ServerVariables;
string protocol = vars["SERVER_PORT_SECURE"] == "1" ? "https://" : "http://";
string domain = vars["SERVER_NAME"];
string port = vars["SERVER_PORT"];

Utilizzando UriBuilder:

    var relativePath = ""; // or whatever-path-you-want
    var uriBuilder = new UriBuilder
    {
        Host = Request.Url.Host,
        Path = relativePath,
        Scheme = Request.Url.Scheme
    };

    if (!Request.Url.IsDefaultPort)
        uriBuilder.Port = Request.Url.Port;

    var fullPathToUse = uriBuilder.ToString();

Che ne dite di:

String domain = "http://" + Request.Url.Host
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top