【问题标题】:How to access HttpContext outside of controllers in ASP.NET MVC?如何在 ASP.NET MVC 中访问控制器之外的 HttpContext?
【发布时间】:2010-12-27 11:00:51
【问题描述】:

特别是会话变量。我的 ASP.NET MVC 项目中有一个 .ashx,它正在提取一些图像数据以显示给用户,并且我需要能够访问存储在会话中的对象。从控制器我可以很好地拉出对象,但在我的 ashx 页面中,context.Session 为空。有什么想法吗?谢谢!

这是我正在尝试做的一个示例... context.Session 总是返回 null。

  private byte[] getIconData(string icon)
    {
        //returns the icon file
        HttpContext context = HttpContext.Current;

        byte[] buffer = null;

        //get icon data
        if ( context.Session["tokens"] != null)
        {
            //do some stuff to get icon data
        }
    }

【问题讨论】:

  • 不是真的...我的问题是我无法访问从我的 MVC 控制器存储的会话变量。当我尝试访问控制器外部的会话时,它只返回 null。
  • 你的代码不是在 IHttpHandler 中吗?如果是这样,这是相同的问题和解决方案。
  • 我很抱歉,你是正确的毛里西奥。我将 IReadOnlySessionState 添加到我的班级,它现在可以很好地读取会话数据。
  • 嗯,我确实接受了一个答案... Alaor 提供的回复不起作用,所以我发布了对我有用的内容并接受了它作为答案。我已经接受了我的每一个有答案的问题的答案。

标签: asp.net asp.net-mvc


【解决方案1】:

您必须在代码中导入 System.Web 程序集,然后您可以执行以下操作:

HttpContext context = HttpContext.Current;

return (User)context.Session["User"];

编辑:

老兄,我在这里做了一些测试,它对我有用,试试这样的:

创建一个帮助类来封装你获取会话变量的东西,它必须导入 System.Web 程序集:

public class TextService
    {
        public static string Message { 
            get 
            { 
                HttpContext context = HttpContext.Current; 
                return (string)context.Session["msg"]; 
            }
            set
            {
                HttpContext context = HttpContext.Current;
                context.Session["msg"] = value;
            }
        }
    }

然后在您的控制器中,您应该执行以下操作:

TextService.Message = "testing the whole thing";
return Redirect("/home/testing.myapp");

在你的其他类中你可以调用辅助类:

return TextService.Message;

试一试。

【讨论】:

  • 它仍然说 Session 为空,尽管能够访问控制器中的几个不同的会话变量。
  • 你已经创建了会话变量?你能在这里显示一些代码吗?
  • 在哪里设置 Session["tokens"] 变量?
  • 我在我的一个 MVC 控制器中设置了 Session["tokens"] 变量。当我尝试从该控制器之外的任何内容中读取它时,我遇到了问题......在这种情况下,特别是它是一个 .ashx 文件。
【解决方案2】:

为了节省任何人的挖掘,对于 .net core 2.1+:

将以下内容添加到您的 Startup.cs 中的 public void ConfigureServices(...):

services.AddHttpContextAccessor();

通过注入您的服务/等来使用:

public MyService(IHttpContextAccessor httpContextAccessor) { //... }

感谢:https://adamstorr.azurewebsites.net/blog/are-you-registering-ihttpcontextaccessor-correctly

【讨论】:

【解决方案3】:

好的,所以我最终不得不做的是……在我的 ashx 文件中,我在 IReadOnlySessionState 接口中添加了它,它可以很好地访问会话状态。所以它看起来像这样......

  public class getIcon : IHttpHandler, IReadOnlySessionState

【讨论】:

    【解决方案4】:

    在 .Net 核心中,在控制器之外访问 HTTPContext 的最佳方式是使用 IHttpContextAccessor。使用 DI,我们可以访问例如 User/HttpContext 对象,例如 _httpContextAccessor.HttpContext.User 和 _httpContextAccessor.HttpContext.HttpContext。 详细答案请参考link。 谢谢!

    【讨论】:

    • 问题是2009年问的。IHttpContextAccessor当时还不存在,是asp.net核心的东西。
    • @mxmissile 我知道这个问题早在 2009 年就被问到了,但最近我遇到了同样的问题,这个堆栈溢出链接是给出的最重要的建议之一。因此,我认为在这里提及解决我的问题的上述解决方案会有所帮助。我会稍微改变我的答案,明确提到这个解决方案是特定于.Net核心的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-16
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    相关资源
    最近更新 更多