首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >OWIN中间件可以使用http会话吗?

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

Stack Overflow用户
提问于 2014-05-09 21:13:10
回答 3查看 16.8K关注 0票数 23

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

一旦我运行它,我注意到HttpContext.Current.Session是空的,并且我没有在我的中间件所具有的IOwinContext上看到任何会话对象。

是否可以从OWIN访问http会话?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-05-14 06:39:00

是的,但这是一个相当大的黑客攻击。它也不能与SignalR一起工作,因为SignalR必须在获取会话之前运行,以防止长会话锁定。

执行此操作可为任何请求启用会话:

代码语言:javascript
复制
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;
    }
}

然后,您可以使用HttpContext.Current.Session

代码语言:javascript
复制
HttpContextBase httpContext = context.Get<HttpContextBase>(typeof(HttpContextBase).FullName);
票数 31
EN

Stack Overflow用户

发布于 2015-11-04 17:30:45

这个答案是来自的混音,所以它的要点应该归因于@Tratcher。不过,单独发布它而不是建议编辑,这已经足够不同了。

假设你想做一个小的OWIN应用程序用于基本的测试目的(例如,在做集成测试时,作为一个更大的API的存根/假冒),包括一种使用会话状态的稍微粗俗的方式就可以了。

首先,您需要以下内容:

代码语言:javascript
复制
using Microsoft.Owin;
using Microsoft.Owin.Extensions;
using Owin;

通过这些,您可以创建一个helper方法:

代码语言:javascript
复制
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);
}

您也可以像原始答案那样将其创建为扩展方法。

请注意,如果不使用UseStageMarker,将会遇到以下错误:

'/‘应用程序中的

服务器错误。

只能在引发“HttpApplication.AcquireRequestState”事件之前调用“HttpContext.SetSessionStateBehavior”。

在任何情况下,您现在都可以在您的OWIN应用程序中使用HttpContext,如下所示:

代码语言:javascript
复制
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);
        }
    });
}

如果你用这个小应用启动IIS Express,你首先会得到:

会话状态下尚无数据。

然后,如果你去http://localhost:12345/write,你会得到:

已写入会话状态!

然后,如果您返回/转到该主机上的任何其他url,您将得到:

11/4/2015 10:28:22 AM

或者类似的东西。

票数 12
EN

Stack Overflow用户

发布于 2021-12-03 20:26:20

这是一个古老的问答,但没有一个答案是完整的,所以我想我应该分享我发现的here。这对我来说很有效!

首先,我必须安装Owin.Extensions。然后..。

你就快到了会话仍然为空的原因是,在执行中间件之前,您没有指示OWIN初始化System.Web会话。

通过添加.UseStageMarker(..)在中间件注册之后,您将告诉OWIN它应该在执行管道中的什么位置执行SetSessionStateBehaviour。

代码语言:javascript
复制
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);

默认情况下,Owin中间件在最后一个事件(PipelineStage.PreHandlerExecute)运行,在这种情况下对你来说太晚了。

现在,要使用会话,您需要在第二个中间件中工作,该中间件在会话被Asp.Net运行时获取之后运行。此中间件必须在PostAquireState阶段运行,如下所示:

代码语言:javascript
复制
.Use((context, next) =>
 {
     // now use the session
     HttpContext.Current.Session["test"] = 1;

     return next();
})
.UseStageMarker(PipelineStage.PostAcquireState);

Asp.Net katana文档中有一篇关于中间件如何工作的优秀文章。有关Asp.net中的执行顺序的详细信息,请参阅PiplineStage枚举文档和HttpApplication文档。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23565543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档