webapi mvc example session owin httpsession

session - mvc - ¿Puede el middleware OWIN usar la sesión http?



variables de session c# mvc 5 (2)

Tenía un poco de código que estaba duplicando para ASP.NET y SignalR y decidí reescribirlo como middleware OWIN para eliminar esta duplicación.

Una vez que lo estaba ejecutando, noté que HttpContext.Current.Session era nulo, y no vi ningún objeto de sesión en el IOwinContext que tiene mi middleware.

¿Es posible acceder a la sesión http desde OWIN?


Sí, pero es un buen truco. Tampoco funcionará con SignalR porque SignalR DEBE ejecutarse antes de adquirir la sesión para evitar bloqueos de sesión largos.

Haga esto para habilitar la sesión para cualquier solicitud:

public static class AspNetSessionExtensions { public static IAppBuilder RequireAspNetSession(this IAppBuilder app) { app.Use((context, next) => { // Depending on the handler the request gets mapped to, session might not be enabled. Force it on. HttpContextBase httpContext = context.Get<HttpContextBase>(typeof(HttpContextBase).FullName); httpContext.SetSessionStateBehavior(SessionStateBehavior.Required); return next(); }); // SetSessionStateBehavior must be called before AcquireState app.UseStageMarker(PipelineStage.MapHandler); return app; } }

Luego puede acceder a la sesión con HttpContext.Current.Session o

HttpContextBase httpContext = context.Get<HttpContextBase>(typeof(HttpContextBase).FullName);


Esta respuesta es un remix de la respuesta inicial , por lo que su esencia debe atribuirse a @Tratcher. Sin embargo, es lo suficientemente diferente como para publicarlo por separado en lugar de sugerir una edición.

Suponiendo que desea crear una pequeña aplicación OWIN para propósitos de prueba básicos (por ejemplo, como un código auxiliar / falso para una API más grande al realizar pruebas de integración), incluso una forma ligeramente elegante de usar el estado de sesión funcionaría bien.

En primer lugar, necesitas estos:

using Microsoft.Owin; using Microsoft.Owin.Extensions; using Owin;

Con ellos puedes crear un método auxiliar:

public static void RequireAspNetSession(IAppBuilder app) { app.Use((context, next) => { var httpContext = context.Get<HttpContextBase>(typeof(HttpContextBase).FullName); httpContext.SetSessionStateBehavior(SessionStateBehavior.Required); return next(); }); // To make sure the above `Use` is in the correct position: app.UseStageMarker(PipelineStage.MapHandler); }

También puedes crear eso como un método de extensión como lo hizo la respuesta original.

Tenga en cuenta que si no usa UseStageMarker , se encontrará con este error:

Error del servidor en la aplicación ''/''.
''HttpContext.SetSessionStateBehavior'' solo se puede invocar antes de que se levante el evento ''HttpApplication.AcquireRequestState''.

En cualquier caso, con lo anterior ahora puedes usar HttpContext en tu aplicación OWIN de esta manera:

public void Configuration(IAppBuilder app) { RequireAspNetSession(app); app.Run(async context => { if (context.Request.Uri.AbsolutePath.EndsWith("write")) { HttpContext.Current.Session["data"] = DateTime.Now.ToString(); await context.Response.WriteAsync("Wrote to session state!"); } else { var data = (HttpContext.Current.Session["data"] ?? "No data in session state yet.").ToString(); await context.Response.WriteAsync(data); } }); }

Si inicias IIS Express con esta pequeña aplicación, primero obtendrás:

No hay datos en estado de sesión todavía.

Luego, si accede a http://localhost:12345/write obtendrá:

¡Escrito al estado de la sesión!

Luego, si regresas / vas a cualquier otra url en ese host, obtendrás:

04/11/2015 10:28:22 AM

O algo similar.