Sprawdź, czy aplikacja ASP.NET działa lokalnie

79

Chcę wiedzieć, czy istnieje zalecany sposób określania, czy aplikacja asp działa lokalnie. W tej chwili używam obiektu Request i wyszukuję ciąg znaków dla localhost lub 127.0.0.1 w zmiennej serwera, ale ma to kilka ograniczeń. Największą z nich jest to, że obiekt Request nie zawsze jest dostępny, gdy go potrzebuję.

Sean
źródło

Odpowiedzi:

148

Zobacz HttpRequest.IsLocal

bool isLocal = HttpContext.Current.Request.IsLocal;
Rex M
źródło
7
A co z tym, gdzie Request jest zerowe. tj .: Application_start?
Meh Man
@mmtemporary podczas Application_Start nie ma żądania, nie ma powodu, aby sprawdzać, czy Request.IsLocal czy nie. Jeśli chcesz go używać na Global.asax, rozważ użycie go wewnątrz Application_BeginRequest.
Vinicius Rocha
1
@ViniciusRocha W niektórych scenariuszach chcemy to sprawdzić, gdy żądanie jest puste.
Meh Man
Mamy UnityContainer do rozwiązywania iniekcji zależności. Mamy zależność IEnvironment, która informuje nas, czy jest to lokalna, tymczasowa czy produkcyjna. Musimy rozwiązać ten problem, gdy żądanie jest puste.
Nick Niebling
1
@NickNiebling Wygląda na pomieszanie terminów ... Myślę, że to pytanie dotyczy ustalenia, czy bieżące żądanie pochodzi z maszyny, która wykonuje aplikację internetową - co oczywiście ma sens tylko wtedy, gdy JEST aktualne żądanie. Brzmi jak Ty. Może naprawdę masz na myśli, czy działa na komputerze produkcyjnym, testowym lub deweloperskim ? Jeśli chodzi o to, jak to określić, myślę, że tylko Ty możesz zdecydować, jak je rozróżnić. Plik konfiguracyjny? Wzorzec nazwy maszyny? Nazwa konta systemowego, które wykonuje aparat ASP.Net?
Oskar Berggren
12

Możesz sprawdzić właściwość Request.IsLocal

Adam
źródło
6

To zadziałało dla mnie z Application_Start

if (!HostingEnvironment.IsDevelopmentEnvironment)
{
      GlobalFilters.Filters.Add(new RequireHttpsAttribute());
}

Aby dowiedzieć się więcej o ustawianiu IsDevelopmentEnvironment, zapoznaj się z następującym wątkiem.

Co w ASP.NET decyduje o wartości HostingEnvironment.IsDevelopmentEnvironment?

Sumanth
źródło
Jest też odwrotnie, jeśli ktoś blokuje na to: HostingEnvironment.IsHosted
G43beli
4

W widoku MVC / stronie ASP / kodzie za klasą:

bool isLocal = HttpContext.Current.Request.IsLocal;

W kontrolerze MVC:

bool isLocal = Request.IsLocal;
Damian Vogel
źródło
1

Request.IsLocal jest tym samym, co sprawdzanie 127.0.0.1 lub :: 1. Zobacz ten post: http://forums.asp.net/p/1065813/4081335.aspx .

ZLA
źródło
2
Tak, ale użycie standardowego wywołania biblioteki lepiej oddaje intencję kodu, IMO. Wolałbym korzystać z biblioteki niż pisać własny kod, aby zrobić tak prostą rzecz.
Sean
Zgadzam się. Chciałem tylko zaznaczyć, że skoro wyznaczona odpowiedź może być tym samym kodem, którego używał plakat, odpowiedź może mieć takie same ograniczenia.
ZLA
1
Ten link nie jest poprawny. Jeśli trafię na mój serwer lokalnie za pośrednictwem jego adresu IP, HttpContext.Current.Request.IsLocal poprawnie zwraca wartość true, ale UserHostAddress to prawdziwy adres IP, a nie 127.0.0.1 (lub :: 1). Przetestowano w .NET 4.
mhenry1384,
jak wskazuje mhenry1384 .. IsLocalrównież odnosi się do odwiedzania witryny usług IIS z tego SAMEGO komputera. W ten sposób domyślnie wyświetla się również szczegółowe komunikaty o błędach YSOD, gdy przychodzą z lokalnego komputera.
Piotr Kula
1

Jeśli HttpContext.Current nie ma wartości null, użyj

HttpContext.Current.Request.IsLocal

W przeciwnym razie, na przykład w App_Start lub przed udostępnieniem HttpContext.Current, możesz przetestować

HostingEnvironment.ApplicationPhysicalPath.StartsWith(@"C:\")

lub dedykowany dysk na komputerze.

Innym sposobem może być użycie stałej zmiennej kompilacji ustawionej w środowisku produkcyjnym, na przykład z Azure i visualstudio.com, jeśli ich używasz.

Jest brudny, ale działa.

Matteo Migliore
źródło
1

W odpowiedzi na komentarz @Meh Men's dotyczący innej odpowiedzi w tym wątku, który zapytał:

A co z tym, gdzie Request jest zerowe. tj .: Application_start?

Jeśli jesteś pewien, że wszystkie wersje produkcyjne i testowe lub „homologacyjne” Twojej witryny zostaną wdrożone wraz z wydaną wersją Twojej witryny, podczas gdy Twoje środowisko lokalne będzie budowane i rozwijane w trybie „debugowania”, możesz wykorzystać #if DEBUGsintax do napisz kod, który powinien być uruchamiany tylko lokalnie, podczas gdy poza tym blokiem lub nawet wewnątrz pasującego #elsebloku możesz napisać inny kod, który chcesz uruchamiać tylko wtedy, gdy nie jest lokalnie (np. zdalnie).

Oto mała próbka tego, jak rozwiązałem ten problem w konkretnym projekcie, nad którym aktualnie pracuję:

#if DEBUG
    // Code here will only be run locally.
#else
    // Code here will only be run "remotely".
Ulysses Alves
źródło
0

Żądanie nie zawsze jest dostępne w środowisku ASP.NET?

HttpContext i jego właściwości Request / Response są inicjowane, gdy tylko serwer rozpocznie przetwarzanie strony. Tak więc w każdym miejscu, w którym możesz wykonać kod C # w cyklu życia strony, powinieneś być w stanie sprawdzić adres URL żądania.

Roman Royter
źródło
Nie zdawałem sobie sprawy, że mogę użyć klasy HttpContext, aby uzyskać dostęp do obiektu Request.
Sean
Z ciekawości, jaka inna metoda dostępu do obiektu Request jest dostępna? Dzięki :)
Roman Royter
6
Tak, obiekty Request i HttpContext nie zawsze są dostępne w aplikacji ASP.NET. Na przykład Application_Startjest wykonywany bez HTTPContext.
Maksim Vi.
1
@RomanR. miejsca pracy utworzone w programie Application_Startmogą zawsze działać w tle. Również pytanie nie ma nic wspólnego z żądaniami stron.
Maksim Vi.
1
^ Zatem na czym polegasz?
eaglei