【问题标题】:The session cannot be established after the response has started响应开始后无法建立会话
【发布时间】:2017-04-27 19:31:00
【问题描述】:

我在日志中看到了这个错误,但我不知道如何重现它。它不会定期发生。

异常消息:响应开始后无法建立会话。 堆栈跟踪:

在 Microsoft.AspNetCore.Session.DistributedSession.Set(String key, Byte[] value)

CustomMiddleware.cs:

    public async Task Invoke(HttpContext context, AlertWriter alertWriter, AlertReader alertReader)
    {
        var sessionAlerts = context.Session.GetString(AlertKey);

        if (!string.IsNullOrWhiteSpace(sessionAlerts))
        {
            var alerts = JsonConvert.DeserializeObject<List<Alert>>(sessionAlerts);
            alertReader.Initialize(alerts);

            context.Session.Remove(AlertKey);
        }

        await _next.Invoke(context);

        if (context.Response.StatusCode >= 300 && context.Response.StatusCode < 400)
        {
            alertWriter.Alerts = alertWriter.Alerts.Union(alertReader).ToList();
        }

        var serializedAlerts = JsonConvert.SerializeObject(alertWriter.Alerts);

        //ERROR IS HERE
        context.Session.SetString(AlertKey, serializedAlerts);
    }

在 Startup.cs 中,app.UseSession(); 是我调用的第一个应用程序。使用...。 Documentation 表示如果您“在您已经开始写入响应流之后尝试创建新会话(即尚未创建会话 cookie)”,则会发生此错误

如何避免此错误?似乎如果我尝试在任何自定义中间件中访问会话,我将不得不检查 .AspNetCore.Session cookie 是否存在?

【问题讨论】:

    标签: c# session asp.net-core asp.net-core-mvc


    【解决方案1】:

    您必须在发送内容之前设置标题。

    await _next.Invoke(..) 之前执行此操作通常是安全的。但是在_next 之后调用它时,不能保证在链中稍后调用的中间件是否写入流。

    您可以通过缓存响应来规避它,直到您的中间件完成,但这可能会对性能产生严重影响,因为需要将完整的流存储在内存中,然后在稍后写入原始流的中间件中。在大响应上,这可能会显着增加应用程序的内存使用量。

    有点像

    using (var buffer = new MemoryStream())
    {
        var body = context.Response.Body;
        context.Response.Body = buffer;
        ...
        await _next.Invoke(...);
    
        // set headers or session
        context.Session.SetString(AlertKey, serializedAlerts);
    
        // read buffer and write to body
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-12
      • 2012-06-06
      • 2013-05-29
      • 2021-09-24
      • 1970-01-01
      • 2014-12-08
      • 2013-12-02
      相关资源
      最近更新 更多