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.