Pregunta

Tengo algunos servicios web ASP.NET que comparten una clase auxiliar común y solo necesitan crear una instancia de por servidor.Se utiliza para una traducción simple de datos, pero pasa algún tiempo durante el inicio cargando cosas desde el archivo web.config, etc. La clase auxiliar es 100% segura para subprocesos.Piense en ello como una simple biblioteca de llamadas a servicios públicos.Compartiría todos los métodos en la clase, pero quiero cargar la configuración inicial desde web.config. Implementamos los servicios web en IIS 6.0 y utilizamos un grupo de aplicaciones, con un jardín web de 15 trabajadores.

Declaré la clase auxiliar como una variable privada compartida en Global.asax y agregué una propiedad de carga diferida Shared ReadOnly como esta:

Private Shared _helper As MyHelperClass

Public Shared ReadOnly Property Helper() As MyHelperClass
    Get
        If _helper Is Nothing Then
            _helper = New MyHelperClass()
        End If
        Return _helper
    End Get
End Property

Tengo código de registro en el constructor para MyHelperClass(), y muestra el constructor ejecutándose para cada solicitud, incluso en el mismo hilo.Estoy seguro de que me faltan algunos detalles clave de ASP.NET, pero MSDN no ha sido de mucha ayuda.

Intenté hacer cosas similares usando ambos. Application("Helper") y Cache("Helper") y todavía vi el constructor ejecutarse con cada solicitud.

¿Fue útil?

Solución

No es aconsejable utilizar el estado de la aplicación a menos que lo necesite absolutamente; las cosas son mucho más sencillas si se limita a utilizar objetos por solicitud.Cualquier adición de estado a las clases auxiliares podría provocar todo tipo de errores sutiles.Utilice la colección de elementos HttpContext.Current e inicialícela por solicitud.Un módulo VB haría lo que usted quiera, pero debe asegurarse de no convertirlo en estado.

Otros consejos

Puede colocar su ayudante en el estado de solicitud.Haga esto en global.asax:

  void Application_Start(object sender, EventArgs e)
  {
    Application.Add("MyHelper", new MyHelperClass());
  }

Puedes utilizar el Ayudante de esa manera:

  MyHelperClass helper = (MyHelperClass)HttpContext.Current.Application["MyHelper"];
  helper.Foo();

Esto da como resultado una única instancia de la clase MyHelperClass que se crea al iniciar la aplicación y permanece en el estado de la aplicación.Dado que la instancia se crea en Application_Start, esto sucede solo una vez por cada instancia de HttpApplication y no por Solicitud.

He hecho algo como esto en mi propia aplicación en el pasado y causó todo tipo de errores extraños.Cada usuario tendrá acceso a los datos de todos los demás en la propiedad.Además, podría terminar con un usuario en medio de su uso y luego ser interrumpido porque otro usuario lo solicita.

No, no está aislado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top