2009-06-30 12 views
20

Creo que MvcApplication es un singleton global. Quiero obtener la instancia de MvcApplication en el controlador. Entonces puse el código siguiente en el controlador:¿Cómo obtener una instancia de 'MvcApplication' en el controlador ASP.NET?

MvcApplication app = HttpContext.Current.Application as MvcApplication; 

Me da un error:

Error 2 'System.Web.HttpContextBase' does not contain a definition for 'Current' and no extension method 'Current' accepting a first argument of type 'System.Web.HttpContextBase' could be found (are you missing a using directive or an assembly reference?)

¿Por qué? ¿Cómo accedo al MvcApplication en el controlador?

+0

¿Podría explicarnos qué es lo que está tratando de lograr con esto? Tal vez hay otra forma, incluso mejor, de llevar a cabo la tarea. – griegs

+0

lo que quiero es: con mi aplicación mvc, quiero obtener el valor de la cadena de consulta cuando el usuario accede a la página de inicio como: http: // localhost: 2929 /? Source = abc. luego quiero configurar este source = abc en MvcApplication. public class MvcApplication: System.Web.HttpApplication { public string Fuente; // ..... } entonces quiero fuente disponible para todas las vistas: Quiero acceder a la fuente en el controlador constructor como: MvcApplication aplicación = HttpContext.Current.Application como MvcApplication cadena src = app.Source ; ... – KentZhou

+2

Advertencia: antes de dejar este hilo con la respuesta marcada, lea mi respuesta a continuación, ya que las otras torres, incluida la marcada, se basan en la suposición errónea de que MvcApplication es un singleton global. – citykid

Respuesta

31

Prueba esto:

var app = HttpContext.ApplicationInstance as MvcApplication; 
+0

Lo intento en el constructor de controlador como:
var app = HttpContext.ApplicationInstance como MvcApplication;
luego recibí un error en la página:
Error del servidor en la aplicación '/'.
....
Línea 35: var app = HttpContext.ApplicationInstance as MvcApplication; – KentZhou

+0

Debe evitar el acceso a las propiedades del controlador como HttpContext o ControllerContext en el constructor. Pruebe lo mismo en Action o en OnActionExecuting() –

16

Creo que la razón por la cual el código original no funcionó es porque HttpContext es a la vez una propiedad del controlador y su propia clase. Dentro de una subclase de Controlador, HttpContext se resolverá en la propiedad y producirá el error mencionado. Para conseguir alrededor de él, referencia explícita a la clase HttpContext con su nombre completo de:

System.Web.HttpContext.Current.Application 

O, ya que la propiedad HttpContext ya se devuelve el HttpContext instancia actual, se puede utilizar:

HttpContext.Application 
40

MvcApplication! = singleton

lo que significa que todas las respuestas anteriores omiten el punto y te meterán en serios problemas si crees erróneamente que tienes acceso a la misma instancia mientras de hecho habrá varios.

Su primera suposición no es válida: Al contrario de (muy - simplemente vea las otras respuestas aquí como una prueba) creencia generalizada, MvcApplication NO es un singleton global. La clase se instancia varias veces, una instancia por "canalización", por lo que el conteo de rendimiento "recuento de instancias de canalización" le indica cuántas instancias de MvcApplication están actualmente consideradas con vida. Añadir una ctor defecto y probar esto por sí mismo:

public MvcApplication() 
{ 
    Trace.WriteLine(this.GetHashCode()); 
} 

depuración romper la línea o ver los distintos códigos hash en DebugViewer. Para forzar el conteo de instancias de canalización ascendente cree un método con Thread.Sleep (5000), Asp.Net iniciará una nueva instancia una vez que realice otra solicitud http en paralelo.

Solución - ¿Cómo crear una instancia únicos en aplicaciones de ASP.NET (MVC) o WebForms

Si su clase MvcApplication sin embargo, tiene un método Application Start() entonces este método se llama en realidad sólo una vez, el proceso de ancho. Puede establecer campos estáticos allí. Simplemente póngalos en cualquier clase, típicamente MvcApplication es una buena opción convencional, y acceda a ellos. Al igual que

MvcApplication.MySingleValue = 72; 
MvcApplication.ActivePlayersCount = 3400; 
var n = MvcApplication.ActivePlayersCount; 
... 

HttpApplication WEIRDNESS

El diseño de la clase HttpApplication y sus eventos es bastante extraño, que presumiblemente tiene su razón en algún tipo suelto de compatibilidad con versiones anteriores de diseño a las páginas ASP de edad muy avanzada basada en COM. Allí el objeto de la aplicación fue de hecho creado solo una vez, que seguramente es el origen de la creencia errónea relacionada con Asp.Net.Un ejemplo de lo extraño HttpApplication:

protected void Application_Start() 
{ 
} 

Tenga en cuenta que no hay anulación participar!

En resumen, las instancias de la aplicación pueden ser de menor interés la mayor parte del tiempo, no veo ningún escenario donde podría ser relevante mantener el estado, ya que su estado sería compartido por un subconjunto arbitrario de solicitudes manejadas. Por lo tanto, acceder a él de la manera completamente precisa mencionada por Matt podría no ser necesaria con demasiada frecuencia.

Cuestiones relacionadas