Stellen Sie fest, ob die ASP.NET-Anwendung lokal ausgeführt wird

79

Ich möchte wissen, ob es eine empfohlene Methode gibt, um festzustellen, ob eine Asp-Anwendung lokal ausgeführt wird. Im Moment verwende ich das Request-Objekt und führe eine Zeichenfolgensuche nach localhost oder 127.0.0.1 für die Servervariable durch, dies hat jedoch mehrere Einschränkungen. Das größte Problem ist, dass das Request-Objekt nicht immer verfügbar ist, wenn ich es brauche.

Sean
quelle

Antworten:

147

Siehe HttpRequest.IsLocal

bool isLocal = HttpContext.Current.Request.IsLocal;
Rex M.
quelle
6
Was ist mit wo Anfrage ist null. dh: Application_start?
Meh Man
@mmtemporary Während des Application_Start gibt es keine Anfrage, es gibt keinen Grund zu prüfen, ob die Request.IsLocal oder nicht. Wenn Sie es in Global.asax verwenden möchten, sollten Sie es in Application_BeginRequest verwenden.
Vinicius Rocha
1
@ViniciusRocha In einigen Szenarien möchten wir überprüfen, ob Request null ist.
Meh Man
Wir haben UnityContainer zum Auflösen der Abhängigkeitsinjektion. Wir haben eine IEnvironment-Abhängigkeit, die uns sagt, ob es sich um eine lokale, eine Staging- oder eine Produktionsabhängigkeit handelt. Wir müssen dies beheben, wenn die Anfrage null ist.
Nick Niebling
@NickNiebling Scheint eine Verwirrung von Begriffen zu sein ... Ich denke, bei dieser Frage geht es darum festzustellen, ob die aktuelle Anforderung von dem Computer kommt, auf dem die Webanwendung ausgeführt wird - was natürlich nur dann sinnvoll ist, wenn eine aktuelle Anforderung vorliegt. Es hört sich so an, als ob Sie vielleicht wirklich meinen, ob es auf Produktion, Staging oder einer Entwicklermaschine läuft ? Ich denke, nur Sie können entscheiden, wie Sie zwischen ihnen unterscheiden können. Konfigurationsdatei? Maschinennamenmuster? Name des Systemkontos, das die ASP.Net-Engine ausführt?
Oskar Berggren
12

Sie können die Request.IsLocal-Eigenschaft überprüfen

Adam
quelle
6

Dies hat bei mir mit Application_Start funktioniert

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

Weitere Informationen zum Festlegen von IsDevelopmentEnvironment finden Sie im folgenden Thread.

Was bestimmt in ASP.NET den Wert von HostingEnvironment.IsDevelopmentEnvironment?

Sumanth
quelle
Es gibt auch das Gegenteil, wenn jemand dafür sperrt: HostingEnvironment.IsHosted
G43beli
4

In einer MVC-Ansicht / ASP-Seite / Code hinter der Klasse:

bool isLocal = HttpContext.Current.Request.IsLocal;

In einem MVC-Controller:

bool isLocal = Request.IsLocal;
Damian Vogel
quelle
1

Request.IsLocal entspricht der Suche nach 127.0.0.1 oder :: 1. Siehe diesen Beitrag: http://forums.asp.net/p/1065813/4081335.aspx .

ZLA
quelle
2
Ja, aber die Verwendung eines Standardbibliotheksaufrufs vermittelt die Absicht des Codes besser, IMO. Ich würde es vorziehen, die Bibliothek zu verwenden, anstatt meinen eigenen Code zu schreiben, um so eine einfache Sache zu tun.
Sean
Genau. Ich wollte nur darauf hinweisen, dass die Antwort möglicherweise dieselben Einschränkungen aufweist, da die angegebene Antwort möglicherweise derselbe Code ist, den das Poster verwendet.
ZLA
1
Dieser Link ist nicht korrekt. Wenn ich meinen Server lokal über seine IP-Adresse anrufe, gibt HttpContext.Current.Request.IsLocal korrekt true zurück, aber die UserHostAddress ist die echte IP-Adresse, nicht 127.0.0.1 (oder :: 1). Getestet in .NET 4.
mhenry1384
Wie mhenry1384 hervorhebt, IsLocalbezieht sich dies auch auf den Besuch der IIS-Site vom selben Computer aus. Dabei werden standardmäßig auch detaillierte YSOD-Fehlermeldungen angezeigt, wenn Sie vom lokalen Computer eingehen.
Piotr Kula
1

Wenn HttpContext.Current nicht null ist, verwenden Sie

HttpContext.Current.Request.IsLocal

Andernfalls können Sie beispielsweise im App_Start oder bevor HttpContext.Current verfügbar ist, testen

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

oder eine dedizierte Festplatte auf Ihrem PC.

Eine andere Möglichkeit ist die Verwendung einer konstanten Kompilierungsvariablen, die in der Produktion festgelegt wurde, z. B. von Azure und visualstudio.com, wenn Sie diese verwenden.

Es ist schmutzig, aber es funktioniert.

Matteo Migliore
quelle
0

Anfrage ist in ASP.NET-Umgebung nicht immer verfügbar?

HttpContext und seine Eigenschaften Request / Response werden initialisiert, sobald der Server mit der Verarbeitung der Seite beginnt. An jedem Ort, an dem Sie C # -Code in Ihrem Seitenlebenszyklus ausführen können, sollten Sie in der Lage sein, die Anforderungs-URL zu überprüfen.

Roman Royter
quelle
Ich wusste nicht, dass ich die HttpContext-Klasse verwenden kann, um auf das Request-Objekt zuzugreifen.
Sean
Welche andere Methode für den Zugriff auf das Anforderungsobjekt steht aus Neugier zur Verfügung? Danke :)
Roman Royter
6
Ja, Request- und HttpContext-Objekte sind in der ASP.NET-Anwendung nicht immer verfügbar. Zum Beispiel Application_Startwird ohne HTTPContext ausgeführt.
Maksim Vi.
1
@ RomanR. Jobs, die in erstellt wurden, werden Application_Startmöglicherweise immer im Hintergrund ausgeführt. Auch die Frage hat nichts mit Seitenanfragen zu tun.
Maksim Vi.
1
^ Worauf verlassen Sie sich dann?
eaglei22
0

Als Antwort auf den Kommentar von @Meh Men für eine andere Antwort in diesem Thread, der fragte:

Was ist mit wo Anfrage ist null. dh: Application_start?

Wenn Sie sicher sind, dass Ihre Produktions- und Test- oder "Homolog" -Versionen Ihrer Website alle mit einer Release-Version Ihrer Website bereitgestellt werden, während Ihre lokale Umgebung im "Debug" -Modus erstellt und entwickelt wird, können Sie #if DEBUGsintax to verwenden Schreiben Sie Code, der nur lokal ausgeführt werden soll, während Sie sich außerhalb dieses Blocks oder sogar innerhalb eines passenden #elseBlocks befinden. Möglicherweise schreiben Sie einen anderen Code, den Sie nur ausführen möchten, wenn er nicht lokal ausgeführt wird (z. B. remote).

Hier ist ein kleines Beispiel, wie ich dieses Problem in einem bestimmten Projekt gelöst habe, an dem ich gerade arbeite:

#if DEBUG
    // Code here will only be run locally.
#else
    // Code here will only be run "remotely".
Ulysses Alves
quelle