2008-10-16 12 views
15

Tengo una instancia de una clase de propósito general que se ejecutará tanto en ASP.NET como en un programa independiente. Este código es sensible al proceso en el que se está ejecutando , es decir, hay métodos de certificación que no deben invocarse si se ejecuta bajo ASP.NET. ¿Cómo se determina si el código se está ejecutando en un proceso ASP.NET ?¿Cómo determinar si el código .NET se está ejecutando en un proceso ASP.NET?

La solución que estoy utilizando actualmente se responde a continuación.


Me gustaría que alguien me añadir un comentario sobre por qué esta pregunta ha conseguido downvoted y/o proponer una mejor manera de pedir él! Solo puedo suponer que al menos algunas personas han analizado la pregunta y han dicho "qué idiota, el código ASP.NET es el código .NET".

+0

Usted puede encontrar su respuesta en el siguiente SO puesto. http://stackoverflow.com/questions/2091866/how-can-a-net-code-know-whether-it-is-running-within-a-web-server-application/2092246#2092246 – deostroll

Respuesta

-1

Esta es mi respuesta a la pregunta.

Primero, asegúrese de que su proyecto hace referencia a System.Web y que su archivo de código está "usando System.Web;".

public class SomeClass { 

    public bool RunningUnderAspNet { get; private set; } 


    public SomeClass() 
    // 
    // constructor 
    // 
    { 
    try { 
     RunningUnderAspNet = null != HttpContext.Current; 
    } 
    catch { 
     RunningUnderAspNet = false; 
    } 
    } 
} 
+1

No funciona fuera de las solicitudes reales. – ygoe

-2
If HttpContext Is Nothing OrElse HttpContext.Current Is Nothing Then 
    'Not hosted by web server' 
End If 
+1

HttpContext es el nombre de una clase, por lo que HttpContext no puede ser nulo. – yfeldblum

1

Creo que lo que realmente quiere hacer es replantear su diseño. Una mejor forma de hacerlo es usar una clase Factory que produzca diferentes versiones de las clases que necesita (diseñadas para implementar interfaces para que pueda usarlas indistintamente) dependiendo de cómo se inicie la aplicación. Esto localizará el código para detectar el uso web y no basado en la web en un lugar en lugar de dispersarlo por todo el código.

public interface IDoFunctions 
{ 
    void DoSomething(); 
} 

public static class FunctionFactory 
{ 
    public static IDoFunctions GetFunctionInterface() 
    { 
    if (HttpContext.Current != null) 
    { 
     return new WebFunctionInterface(); 
    } 
    else 
    { 
     return new NonWebFunctionInterface(); 
    } 
    } 
} 

public IDoFunctions WebFunctionInterface 
{ 
    public void DoSomething() 
    { 
     ... do something the web way ... 
    } 
} 

public IDoFunctions NonWebFunctionInterface 
{ 
    public void DoSomething() 
    { 
     ... do something the non-web way ... 
    } 
} 
+4

Buena idea y muy complicada para lo que necesito que es lanzar una excepción cuando se llama a una pequeña cantidad de métodos cuando se ejecuta bajo ASP.NET. –

+0

Esto "fallará" cuando se ejecuta en un subproceso si la definición es para "ejecutar en un * proceso IIS *", en oposición a "ejecutar con una solicitud IIS actual/válida *" (esto * no importa en algunos casos) Así que, al final, es un montón de código mostrar 'HttpContext.Current! = Null' que tiene el problema mencionado anteriormente. No me opongo a dicho diseño, pero es tangencial a la pregunta original y el contexto específico necesita ser considerado. – user2864740

12

HttpContext.Current también puede ser nulo dentro de ASP.NET si estás usando métodos asíncronos, como la tarea asíncrona sucede en un nuevo hilo que no comparte la HttpContext del hilo original. Esto puede ser o no lo que desea, pero si no, entonces creo que HttpRuntime.AppDomainAppId no será nulo en ningún otro proceso ASP.NET y nulo en ningún otro lado.

+1

¿Cuál sería la ventaja de usar 'HttpRuntiime.AppDomainAppId' frente a [la respuesta de ghigad] (http://stackoverflow.com/a/28993766/9664) que utiliza' HostingEnvironment.IsHosted'? –

2

Prueba esto:

using System.Web.Hosting; 

// ... 

if (HostingEnvironment.IsHosted) 
{ 
    // You are in ASP.NET 
} 
else 
{ 
    // You are in a standalone application 
} 

trabajado para mí!

Ver HostingEnvironment.IsHosted para más detalles ...

0
using System.Diagnostics; 

if (Process.GetCurrentProcess().ProcessName == "w3wp") 
    //ASP.NET 
+3

Utilice el enlace [editar] para explicar cómo funciona este código y no solo proporcione el código, ya que una explicación es más probable que ayude a los lectores futuros. Ver también [respuesta]. [fuente] (http://stackoverflow.com/users/5244995) –

Cuestiones relacionadas