Determine si la aplicación ASP.NET se está ejecutando localmente

79

Quiero saber si existe una forma recomendada de determinar si una aplicación asp se está ejecutando localmente. Por el momento, uso el objeto Request y hago una búsqueda de cadena para localhost o 127.0.0.1 en la variable del servidor, pero esto tiene varias limitaciones. El más importante es que el objeto Solicitud no siempre está disponible cuando lo necesito.

Sean
fuente

Respuestas:

148

Ver HttpRequest.IsLocal

bool isLocal = HttpContext.Current.Request.IsLocal;
Rex M
fuente
7
¿Qué pasa con Request es nulo? es decir: Application_start?
Meh Man
@mmtemporary durante Application_Start no hay solicitud, no hay razón para verificar si Request.IsLocal o no. Si desea usarlo en Global.asax, considere usarlo dentro de Application_BeginRequest.
Vinicius Rocha
1
@ViniciusRocha En algún escenario queremos comprobar que cuando Request es nulo.
Meh Man
Tenemos UnityContainer para resolver la inyección de dependencia. Tenemos una dependencia de IEnvironment que nos dice si es local, de ensayo o de producción. Necesitamos resolver esto cuando la solicitud sea nula.
Nick Niebling
1
@NickNiebling Parece una confusión de términos ... Creo que esta pregunta se trata de determinar si la solicitud actual proviene de la máquina que ejecuta la aplicación web, lo que, por supuesto, solo tiene sentido si hay una solicitud actual. Suena como si tal vez quisiera decir si se está ejecutando en producción, puesta en escena o en una máquina de desarrollo . En cuanto a cómo determinar eso, creo que solo tú puedes decidir cómo diferenciarlos. ¿Archivo de configuración? ¿Patrón de nombre de máquina? ¿Nombre de la cuenta del sistema que ejecuta el motor ASP.Net?
Oskar Berggren
12

Puede comprobar la propiedad Request.IsLocal

Adán
fuente
6

Esto funcionó para mí con Application_Start

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

Para saber más sobre cómo se configura IsDevelopmentEnvironment, consulte el siguiente hilo.

En ASP.NET, ¿qué determina el valor de HostingEnvironment.IsDevelopmentEnvironment?

Sumanth
fuente
También existe lo contrario si alguien está bloqueando para eso: HostingEnvironment.IsHosted
G43beli
4

En una vista MVC / página ASP / código detrás de la clase:

bool isLocal = HttpContext.Current.Request.IsLocal;

En un controlador MVC:

bool isLocal = Request.IsLocal;
Damian Vogel
fuente
1

Request.IsLocal es lo mismo que verificar 127.0.0.1 o :: 1. Vea esta publicación: http://forums.asp.net/p/1065813/4081335.aspx .

ZLA
fuente
2
Sí, pero el uso de una llamada de biblioteca estándar transmite mejor la intención del código, en mi opinión. Preferiría usar la biblioteca en lugar de escribir mi propio código para hacer algo tan simple.
Sean
Estoy de acuerdo. Solo quería señalar que, dado que la respuesta designada puede ser el mismo código que estaba usando el póster, la respuesta puede tener las mismas limitaciones.
ZLA
1
Ese vínculo no es correcto. Si accedo a mi servidor localmente a través de su dirección IP, HttpContext.Current.Request.IsLocal devuelve verdadero correctamente, pero UserHostAddress es la dirección IP real, no 127.0.0.1 (o :: 1). Probado en .NET 4.
mhenry1384
como señala mhenry1384 ... IsLocaltambién se refiere a cuando visita el sitio de IIS desde la MISMA máquina. Al hacerlo, también se muestran los mensajes de error detallados de YSOD de forma predeterminada, cuando se ingresa desde la máquina local.
Piotr Kula
1

Si HttpContext.Current no es nulo, use

HttpContext.Current.Request.IsLocal

De lo contrario, por ejemplo, en App_Start o antes de que HttpContext.Current esté disponible, puede probar

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

o un disco dedicado en su PC.

Otra forma puede ser usar una variable de compilación constante establecida en producción, por ejemplo, de Azure y visualstudio.com si las usa.

Está sucio, pero funciona.

Matteo Migliore
fuente
0

¿La solicitud no siempre está disponible en el entorno ASP.NET?

HttpContext y sus propiedades Request / Response se inicializan tan pronto como el servidor comienza a procesar la página. Entonces, en cualquier lugar donde pueda ejecutar el código c # en el ciclo de vida de su página, debería poder verificar la URL de solicitud.

Roman Royter
fuente
No me di cuenta de que podía usar la clase HttpContext para acceder al objeto Request.
Sean
Por curiosidad, ¿qué otro método para acceder al objeto Solicitud está disponible? Gracias :)
Roman Royter
6
Sí, los objetos Request y HttpContext no siempre están disponibles en la aplicación ASP.NET. Por ejemplo, Application_Startse ejecuta sin HTTPContext.
Maksim Vi.
1
@RomanR. Los trabajos creados en Application_Startpueden estar siempre ejecutándose en segundo plano. Además, la pregunta no tiene nada que ver con las solicitudes de página.
Maksim Vi.
1
^ Entonces, ¿en qué confías?
eaglei22
0

En respuesta al comentario de @Meh Men para otra respuesta en este hilo, quien preguntó:

¿Qué pasa con Request es nulo? es decir: Application_start?

Si está seguro de que sus versiones de producción y de prueba u "homologadas" de su sitio web se implementarán con una versión de lanzamiento de su sitio web, mientras que su entorno local se creará y desarrollará en modo "depuración", puede hacer uso de #if DEBUGsintax para escriba código que solo debe ejecutarse localmente, mientras que fuera de este bloque, o incluso dentro de un #elsebloque coincidente , puede escribir algún otro código que desee que se ejecute solo cuando no sea localmente (por ejemplo: de forma remota).

Aquí hay una pequeña muestra de cómo resolví este problema en un proyecto en particular en el que estoy trabajando actualmente:

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