Jak uzyskać aktualną nazwę domeny w ASP.NET

84

Chcę uzyskać bieżącą nazwę domeny w asp.net C #.

Używam tego kodu.

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

Mój adres URL jest, localhost:5858ale tylko zwraca localhost.

Teraz używam mojego projektu w localhost. Chcę uzyskać localhost: 5858.

Na przykład, gdy używam tej domeny

www.somedomainname.com

Chcę dostać somedomainname.com

Proszę dać mi pomysł, jak uzyskać obecną nazwę domeny.

Jatin Gadhiya
źródło
1
Nazwa hosta i nazwa domeny to dwie różne rzeczy. Czy chcesz mieć domenę zmapowaną na Twój konkretny adres IP lub nazwę hosta komputera, na którym działa?
Rob Goodwin
var base_url = "@ Request.Url.GetLeftPart (UriPartial.Authority) @ Url.Content (" ~ / ")"
Prince Prasad

Odpowiedzi:

81

Używanie Request.Url.Hostjest właściwe - w ten sposób uzyskujesz wartość Host:nagłówka HTTP , który określa, jakiej nazwy hosta (nazwy domeny) chce UA (przeglądarka), ponieważ część ścieżki zasobu żądania HTTP nie zawiera nazwy hosta.

Zauważ, że localhost:5858nie jest to nazwa domeny, to specyfikator punktu końcowego, zwany także „autorytetem”, który zawiera nazwę hosta i numer portu TCP. Jest to pobierane przez dostęp Request.Uri.Authority.

Ponadto, nie jest ważne, aby uzyskać somedomain.comod www.somedomain.componieważ serwer WWW może być skonfigurowany tak, aby służyć innym miejscu na www.somedomain.comporównaniu somedomain.com, jednak jeśli jesteś pewien, że to jest ważne w przypadku, wtedy będziesz musiał ręcznie analizowania hosta, choć przy użyciu String.Split('.')prace w szczypta.

Należy zauważyć, że konfiguracja serwera internetowego (IIS) różni się od konfiguracji ASP.NET i że ASP.NET w rzeczywistości całkowicie nie zna konfiguracji powiązań HTTP witryn internetowych i aplikacji internetowych, na których działa. Fakt, że zarówno IIS, jak i ASP.NET mają te same pliki konfiguracyjne ( web.config), to problem.

Dai
źródło
121

Spróbuj uzyskać „lewą część” adresu URL, na przykład:

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

To daje albo http://localhost:5858albo https://www.somedomainname.comczy jesteś na lokalnym lub produkcji. Jeśli chcesz usunąć wwwczęść, skonfiguruj usługi IIS, aby to zrobić, ale to inny temat.

Zwróć uwagę, że wynikowy adres URL nie będzie miał końcowego ukośnika.

Arturo Torres Sánchez
źródło
7
Moim zdaniem to powinna być najlepsza odpowiedź.
Andrew,
To zadziałało znakomicie na moje potrzeby. Jednak jedna mała poprawka: podczas żądania części Authority, zwracany ciąg nie będzie zawierał końcowego ogranicznika ścieżki. Tak więc:http://localhost:60333
Czy
1
var base_url = "@ Request.Url.GetLeftPart (UriPartial.Authority) @ Url.Content (" ~ / ")"
Prince Prasad
1
Wydaje się, że to nie działa w Asp.Net Core 2.2. Otrzymuję „HttpContext” nie zawiera definicji „Current” i nie można znaleźć żadnej dostępnej metody rozszerzenia „Current” akceptującej pierwszy argument typu „HttpContext” (czy brakuje dyrektywy using lub odwołania do zestawu?).
Stian
@Stian Najwyraźniej jest inny post, który już na to odpowiada: stackoverflow.com/questions/31243068/… . Te odpowiedzi skupiają się tylko na części URI.
Arturo Torres Sánchez
42

Oto zrzut ekranu Request.RequestUrii wszystkie jego właściwości w celach informacyjnych.

wprowadź opis obrazu tutaj

ThiagoPXP
źródło
18

Możesz wypróbować następujący kod:

 Request.Url.Host +
    (Request.Url.IsDefaultPort ? "" : ":" + Request.Url.Port)
Rajeev Mehta
źródło
6

www.somedomain.com to domena / host. Subdomena jest ważną częścią. www.jest często używany zamiennie z brakiem, ale to musi być ustawione jako zasada (nawet jeśli jest ustawione domyślnie), ponieważ nie są równoważne. Pomyśl o innej subdomenie, na przykład mx.. To prawdopodobnie ma inny cel niż www..

Biorąc to pod uwagę, radziłbym nie robić tego rodzaju rzeczy. To powiedziawszy, ponieważ pytasz, wyobrażam sobie, że masz dobry powód.

Osobiście sugerowałbym www.do tego specjalną obudowę .

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

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

W przeciwnym razie, jeśli jesteś naprawdę w 100% pewien, że chcesz odciąć jakąkolwiek subdomenę, będziesz potrzebować czegoś nieco bardziej skomplikowanego.

string host = ...;

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

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

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

Dostanie się do portu jest takie, jak mówili inni.

Matthew Haugen
źródło
1

HttpContext.Current.Request.Url.Host zwraca prawidłowe wartości. Jeśli uruchomisz go na www.somedomainname.com, otrzymasz www.somedomainname.com. Jeśli chcesz również uzyskać 5858, musisz użyć

HttpContext.Current.Request.Url.Port 
artm
źródło
1

Request.ServerVariablesobiekt pracuje dla mnie. Nie znam żadnego powodu, żeby go nie używać.

ServerVariables["SERVER_NAME"]i ServerVariables["HTTP_URL"]powinieneś dostać to, czego szukasz

PJ Leirer
źródło
1

Możesz wypróbować następujący kod, aby uzyskać w pełni kwalifikowaną nazwę domeny:

Request.Url.Scheme + System.Uri.SchemeDelimiter + Request.Url.Host
Yogesh Patel
źródło
4
Chociaż ten fragment kodu może rozwiązać problem, dołączenie wyjaśnienia naprawdę pomaga poprawić jakość Twojego posta. Pamiętaj, że odpowiadasz na pytanie do czytelników w przyszłości, a osoby te mogą nie znać powodów, dla których zaproponowałeś kod.
Dr Rob Lang
1

Oto szybki i łatwy sposób uzyskania nazwy adresu 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
źródło
0

Spróbuj tego:

@ Request.Url.GetLeftPart (UriPartial.Authority)

Hiren Patel
źródło
Ta odpowiedź nie wyjaśnia, dlaczego to działa, a w rzeczywistości jest identyczna z jedną z istniejących odpowiedzi.
Arturo Torres Sánchez
0

Aby uzyskać podstawowy adres URL w MVC nawet z subdomeną www.somedomain.com/subdomain:

var url = $"{Request.Url.GetLeftPart(UriPartial.Authority)}{Url.Content("~/")}";
Ivan-San
źródło
0

Używam go w ten sposób w asp.net core 3.1

 var url =Request.Scheme+"://"+ Request.Host.Value;
zoha_sh
źródło