c# - ¿Debo usar el entorno de OwinContext para almacenar datos específicos de la aplicación por solicitud?
asp.net unity-container (1)
El diccionario de entorno OWIN se puede utilizar para almacenar datos por solicitud. La colección de propiedades del objeto de solicitud puede usarse para hacer lo mismo.
La principal diferencia es que el diccionario del entorno OWIN es un concepto de OWIN y es aplicable a cualquier middleware que se ejecute en un host OWIN. La colección de propiedades del objeto de solicitud es un concepto de API web ASP.NET y solo es aplicable a ese marco específico.
Por cierto, la API web de ASP.NET se ejecuta como un middleware en el canal de OWIN. Entonces, para responder a su pregunta, no puede acceder a la colección de propiedades de solicitud de la API web desde su middleware porque es aplicable solo al middleware de la API web (o ese marco específico).
Si desea escribir su material de interés transversal como middleware OWIN, debe utilizar el diccionario de entorno OWIN. Si la extensión de la API web apunta como un filtro o un manejador de mensajes, puede usar la colección de propiedades.
Obviamente, todo lo que escriba aprovechando los puntos de extensión de la API web es aplicable solo a la API web, mientras que el middleware OWIN es aplicable a cualquier tipo de aplicación que se ejecute en OWIN pipeline y eso incluye la API web.
Necesito una forma de almacenar un objeto de registro por solicitud. Con HttpContext agregaría esto a los artículos Diccionario. No quiero incluir HttpContext en esto si puedo evitarlo. El código que aparece a continuación es lo que propongo para Unity LifeTimeManager que almacenará objetos en la propiedad Environment de OwinContext, a la que tengo acceso con mi middleware Owin.
public class OwinContextLifetimeManager : LifetimeManager
{
private string key = (new Guid()).ToString();
private IDictionary<string, object> environment;
public OwinContextLifetimeManager(IDictionary<string, object> environment)
{
this.environment = environment;
}
public override object GetValue()
{
if (environment != null && environment.ContainsKey(key))
return environment[key];
else
return null;
}
public override void RemoveValue()
{
if (environment != null)
environment.Remove(key);
}
public override void SetValue(object newValue)
{
if (environment != null)
environment[key] = newValue;
}
}
Entonces puedo usarlo así desde mi middleware:
container.RegisterType<IRequestLog, RequestLog>(new OwinContextLifetimeManager(environment));
Se me ocurre que puedo elegir la clave que quiera, excepto las que ya están reservadas por Owin. ¿Hay alguna razón por la que no debería usar OwinContext.Environment para este propósito? La documentación de MSDN es vaga sobre las mejores prácticas de esto.
La respuesta de Darrel Miller aquí: ¿Cómo debo almacenar los datos por solicitud cuando uso la API web ASP.NET de OWIN to Self-Host me hace creer que la colección de propiedades en el objeto de solicitud es el camino a seguir? ¿Cómo puedo acceder a este objeto desde el middleware?