在中间件中使用.NET Core Session

8

当我在 .NET Core 中编写中间件并缩短请求链并返回响应时,它不会设置会话 cookie。以下是一个简短的示例:

public class Middleware
{

    private RequestDelegate _next;

    public Middleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        var req = context.Request;
        if (req.Path.ToString() == "/hello-world")
        {
            context.Response.StatusCode = 200;
            context.Response.Headers["Content-Type"] = "text/html; charset=utf-8";
            await context.Response.WriteAsync("Hello, world!");
            return;
        }

        await _next(context);

    }

}

这是我Startup类的相关代码:

public class Startup
{

    public void ConfigureServices(IServiceCollection services)
    {
        services
            .AddDistributedMemoryCache()
            .AddSession();
    }

    public void Configure(IApplicationBuilder app)
    {
        app
            .UseSession()
            .UseMiddleware<Middleware>();
    }
}

通过传递的响应头:

HTTP 200 No Error

Server: Kestrel
Set-Cookie: .AspNetCore.Session=CfDJ8C1XpX5nCrFCnHz%2BDwlF41YjVSyPMqB8Qmk6qcDPnOSpG22yun3hsXpRBgMDhlX%2ByLbqkUtqPRYY%2B1%2Bno5WeRLnabM1zBDggvB4YEg6ooBiGN%2B5ktjjgfp4uH5mmlWZpEQyQJQb0vKDGwqWpMlLEGjMxVIMqOnkqjM0DvsQIPjt6; path=/; samesite=lax; httponly
Content-Type: text/html; charset=utf-8
Pragma: no-cache
Transfer-Encoding: Identity
Date: Thu, 18 Jan 2018 20:48:55 GMT
Expires: -1
Cache-Control: no-cache

短路响应头:

HTTP 200 No Error

Transfer-Encoding: Identity
Content-Type: text/html; charset=utf-8
Server: Kestrel
Date: Thu, 18 Jan 2018 21:17:39 GMT

简而言之,我需要知道为什么会话中间件没有返回cookie。当我加载页面时,还会出现一些关于无法解码cookie的会话警告。

1个回答

4

我还没有向会话中添加任何内容,因此中间件未创建会话。只需添加context.Session.SetString("stuff", "3");(或其Set*变体之一),即可将会话发送到客户端。在编写响应正文之前执行此操作。


谢谢,帮了我一个大忙。我一直在遇到一个错误,提示会话未启动,尽管按照 .net core 文档中的指示进行了添加/配置。但是只要我添加了一个随机变量,它就可以工作了!;-) - padigan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接