tutorial net mvc microsoft asp asp.net-mvc

asp.net-mvc - microsoft - asp.net mvc tutorial



¿Cómo obtener una instancia ''MvcApplication'' en el controlador ASP.NET? (3)

Creo que MvcApplication es un singleton global. Quiero obtener la instancia de MvcApplication en el controlador. Luego puse el siguiente código en el controlador:

MvcApplication app = HttpContext.Current.Application as MvcApplication;

Me da un error:

Error 2 ''System.Web.HttpContextBase'' no contiene una definición para ''Actual'' y no se puede encontrar un método de extensión ''Actual'' que acepte un primer argumento de tipo ''System.Web.HttpContextBase'' (¿falta una directiva de uso o una referencia de montaje?)

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


Creo que la razón por la que el código original no funcionó es porque HttpContext es propiedad tanto de Controller como de su propia clase. Dentro de una subclase de Controlador, HttpContext se resolverá con la propiedad y producirá el error mencionado. Para evitarlo, haga referencia explícita a la clase HttpContext con su nombre completo:

System.Web.HttpContext.Current.Application

O bien, como la propiedad HttpContext ya devuelve la instancia actual de HttpContext, podría usar:

HttpContext.Application


Prueba esto:

var app = HttpContext.ApplicationInstance as MvcApplication;


MvcApplication! = Singleton

lo que significa que todas las respuestas anteriores pasan por alto el punto y le causarán serios problemas si cree erróneamente que tiene acceso a la misma instancia, mientras que, de hecho, habrá varias.

Su primera suposición no es válida: al contrario de (muy, solo vea las otras respuestas aquí como una prueba) creencia generalizada, MvcApplication NO es un singleton global. La clase se crea una instancia varias veces, una instancia por "canalización", por lo que el contador de rendimiento "cuenta de canalización" le dice cuántas instancias de MvcApplication se consideran actualmente como vivas. Agrega un ctor por defecto y prueba esto tú mismo:

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

Debug rompe la línea o mira los diversos códigos hash en DebugViewer. Para forzar el recuento de instancias de tubería, 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 de singletons en aplicaciones Asp.Net (MVC o WebForms)

Sin embargo, si su clase MvcApplication tiene un método Application_Start (), este método solo se llama una vez, en todo el proceso. Puede establecer campos estáticos allí. Simplemente póngalos en cualquier clase, normalmente MvcApplication es una buena opción convencional y acceda a ellos. Me gusta

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

HttpAplicación de rarezas

El diseño de la clase HttpApplication y sus eventos es bastante extraño, lo que presumiblemente tiene su razón en algún tipo de compatibilidad hacia atrás con el diseño de páginas ASP antiguas basadas en COM. Allí, el objeto de la aplicación fue creado de hecho solo una vez, lo que seguramente es el origen de la creencia errónea relacionada con Asp.Net. Un ejemplo de la extrañeza de HttpApplication:

protected void Application_Start() { }

Tenga en cuenta que no hay anulación involucrada!

En resumen, las instancias de la aplicación pueden ser de menor interés la mayor parte del tiempo, no veo ningún escenario en el que pueda ser relevante para 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 más fina que menciona Matt podría no ser necesario con demasiada frecuencia.