C# OWIN中间件可以使用http会话吗?
我有一点代码是为ASP.NET和Signal复制的,我决定将其重写为OWIN中间件以消除这种重复 当我运行它时,我注意到C# OWIN中间件可以使用http会话吗?,c#,asp.net,session,owin,httpsession,C#,Asp.net,Session,Owin,Httpsession,我有一点代码是为ASP.NET和Signal复制的,我决定将其重写为OWIN中间件以消除这种重复 当我运行它时,我注意到HttpContext.Current.Session为空,并且在我的中间件的IOwinContext上没有看到任何会话对象 是否可以从OWIN访问http会话 是的,但这是一个相当棘手的问题。它也不能与SignalR一起工作,因为SignalR必须在获取会话之前运行,以防止长会话锁定 执行此操作可为任何请求启用会话: public static class AspNetSes
HttpContext.Current.Session
为空,并且在我的中间件的IOwinContext
上没有看到任何会话对象
是否可以从OWIN访问http会话 是的,但这是一个相当棘手的问题。它也不能与SignalR一起工作,因为SignalR必须在获取会话之前运行,以防止长会话锁定 执行此操作可为任何请求启用会话:
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;
}
}
这个答案是由@Tratcher混合而成的,所以它的要点应该归于@Tratcher。不过,这已经足够不同了,可以单独发布,而不是建议编辑
假设您想制作一个用于基本测试目的的小OWIN应用程序(例如,在进行集成测试时,作为更大API的存根/假存根),包括使用会话状态的一种略带哈克风格的方式,就可以了 首先,您需要这些:
使用Microsoft.Owin;
使用Microsoft.Owin.Extensions;
使用Owin;
使用这些工具,您可以创建帮助器方法:
publicstaticvoidrequireaspnetsession(IAppBuilder应用程序)
{
应用程序使用((上下文,下一步)=>
{
var httpContext=context.Get(typeof(HttpContextBase.FullName);
httpContext.SetSessionStateBehavior(SessionStateBehavior.Required);
返回next();
});
//为确保上述“使用”处于正确位置:
app.UseStageMarker(PipelineStage.MapHandler);
}
您还可以像原始答案那样创建一个扩展方法
请注意,如果不使用UseStageMarker
,您将遇到以下错误:
“/”应用程序中的服务器错误。“HttpContext.SetSessionStateBehavior”只能在引发“HttpApplication.AcquisiteRequestState”事件之前调用 在任何情况下,您现在都可以在OWIN应用程序中使用HttpContext,如下所示:
public void配置(IAppBuilder应用程序)
{
RequireAspNetSession(应用程序);
运行(异步上下文=>
{
if(context.Request.Uri.AbsolutePath.EndsWith(“write”))
{
HttpContext.Current.Session[“data”]=DateTime.Now.ToString();
wait context.Response.WriteAsync(“已写入会话状态!”);
}
其他的
{
var data=(HttpContext.Current.Session[“data”]?“还没有处于会话状态的数据。”).ToString();
wait context.Response.WriteAsync(数据);
}
});
}
如果使用此小应用程序启动IIS Express,您将首先获得:
还没有处于会话状态的数据
然后,如果您转到http://localhost:12345/write
您将获得:
已写入会话状态
然后,如果您返回/转到该主机上的任何其他url,您将获得:
2015年11月4日上午10:28:22
或者类似的东西。
System.Web.HttpContext.Current.Session
在OnResponseSignIn方法中为null。代码:Provider=新CookieAuthenticationProvider(){OnResponseSignIn=async context=>
我的会话仍然为空。这是什么原因造成的?这里也是一样,它仍然是null
!!@Rastko也许这个会话黑客可以在IIS上使用OWIN,但不能使用自托管OWIN。您使用的是哪种会话?正确,自托管中没有会话。会话在app.UseStageMarker
)都将遇到空会话,无论此修复如何。
HttpContextBase httpContext = context.Get<HttpContextBase>(typeof(HttpContextBase).FullName);