.Net Core MVC 2.1 中是否有等效的会话开始? [英] Is there a session start equivalent in .Net Core MVC 2.1?

查看:14
本文介绍了.Net Core MVC 2.1 中是否有等效的会话开始?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在 MVC 5 中,您可以在会话开始时在 global.asx 中为会话分配一个值.有没有办法在.Net Core MVC 中做到这一点?我已经配置了会话,但在中间件中它似乎在每个请求上都会被调用.

In MVC 5 you could assign a value to session in global.asx when the session started. Is there a way you can do this in .Net Core MVC? I have session configured but in the middleware it seems to get called on every request.

推荐答案

nercan 的解决方案会起作用,但我想我找到了一个需要更少代码并且可能还有其他优势的解决方案.

nercan's solution will work, but I think I found a solution that requires less code and may have other advantages.

首先,像这样包装 DistributedSessionStore:

First, wrap DistributedSessionStore like this:

using System;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Session;
using Microsoft.Extensions.Caching.Distributed;
using Microsoft.Extensions.Logging;

public interface IStartSession
{
    void StartSession(ISession session);
}

public class DistributedSessionStoreWithStart : ISessionStore
{
    DistributedSessionStore innerStore;
    IStartSession startSession;
    public DistributedSessionStoreWithStart(IDistributedCache cache, 
        ILoggerFactory loggerFactory, IStartSession startSession)
    {
        innerStore = new DistributedSessionStore(cache, loggerFactory);
        this.startSession = startSession;
    }

    public ISession Create(string sessionKey, TimeSpan idleTimeout, 
        TimeSpan ioTimeout, Func<bool> tryEstablishSession, 
        bool isNewSessionKey)
    {
        ISession session = innerStore.Create(sessionKey, idleTimeout, ioTimeout,
             tryEstablishSession, isNewSessionKey);
        if (isNewSessionKey)
        {
            startSession.StartSession(session);
        }
        return session;
    }
}

然后在 Startup.cs 中注册这个新类:

Then register this new class in Startup.cs:

class InitSession : IStartSession
{
    public void StartSession(ISession session)
    {
        session.SetString("Hello", "World");
    }
}

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        ...
        services.AddSingleton<IStartSession, InitSession>();
        services.AddSingleton<ISessionStore, DistributedSessionStoreWithStart>();
        services.AddSession();
        ...
    }

完整代码在这里:https://github.com/SurferJeffAtGoogle/scratch/tree/master/StartSession/MVC

这篇关于.Net Core MVC 2.1 中是否有等效的会话开始?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆