C# OWIN中间件可以使用http会话吗?

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

我有一点代码是为ASP.NET和Signal复制的,我决定将其重写为OWIN中间件以消除这种重复

当我运行它时,我注意到
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。您使用的是哪种会话?正确,自托管中没有会话。会话在中初始化ode>AcquireStatestage。在此阶段之前运行的任何Owin中间件(例如通过使用
app.UseStageMarker
)都将遇到空会话,无论此修复如何。
HttpContextBase httpContext = context.Get<HttpContextBase>(typeof(HttpContextBase).FullName);