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ę.

Odpowiedzi:


148

Zobacz HttpRequest.IsLocal

bool isLocal = HttpContext.Current.Request.IsLocal;

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



4

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

bool isLocal = HttpContext.Current.Request.IsLocal;

W kontrolerze MVC:

bool isLocal = Request.IsLocal;

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 .


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.


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".

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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.