Asp.Net Mvc Core 中的无会话控制器

Sessionless controller in Asp.Net Mvc Core

我需要从控制器中删除会话,因为它会给我的 Redis 服务器增加不必要的负载。我使用 Redis 来存储我的会话。

我有一个控制器,它是从 Web 挂钩使用的,它调用速度很快,而且调用量很大,Web 挂钩不使用会话,如果我可以从中完全删除会话会更好。

当我 google 搜索时,我发现了从控制器中删除会话的属性 [ControllerSessionState],但不幸的是它只适用于 Mvc3。

Asp.Net Mvc Core 有类似的东西吗?

有两种基本方法

中间件过滤器

创建一个基础控制器,您的有状态控制器从中继承并用注册会话的 middleware filter attribute 装饰它。

创建后您将拥有一个基础class

public class SessionPipeline
{
    public void Configure(IApplicationBuilder applicationBuilder)
    {
        applicationBuilder.UseSession();
    }
}

[MiddlewareFilter(typeof(SessionPipeline))]
public class StatefulControllerBase : ControllerBase
{
}

并让您的有状态控制器继承自 StatefulControllerBase 而不是 ControllerBase/Controller

使用 MapWhen 有条件地注册 Session

这种方法在 ASP.NET Core 1.x 的第一个版本中更为常见,但如今已很少使用

app.MapWhen(context => !context.Request.Path.StartsWith("/hooks/"), branch => 
{
    branch.UseSession();
});

这样会话中间件将只用于不匹配 /hooks/ 请求路径的路径。