如何在ASP.NET MVC中访问控制器之外的HttpContext?

How to access HttpContext outside of controllers in ASP.NET MVC?

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

下面是我要做的事情的一个例子…context.session始终返回空值。

1
2
3
4
5
6
7
8
9
10
11
12
13
  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
        }
    }


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

1
2
3
HttpContext context = HttpContext.Current;

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

编辑:

伙计,我在这里做了一些测试,它对我很有用,试试这样的方法:

创建一个助手类来封装您获取会话变量的内容,它必须导入System.Web程序集:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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;
            }
        }
    }

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

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

在您的其他类中,您可以调用helper类:

1
return TextService.Message;

试一试。


好吧,我最后不得不做的是……在我的ashx文件中,我添加了IReadonlySessionState接口,它将访问会话状态。所以看起来像这样…

1
  public class getIcon : IHttpHandler, IReadOnlySessionState


在.NET核心中,访问控制器外部httpContext的最佳方法是使用IHttpContextAccessor。使用DI,我们可以访问用户/httpContext对象,例如httpContextAccessor.httpContext.user和httpContextAccessor.httpContext.httpContext。有关详细答案,请参阅此链接。谢谢!


为了拯救任何人的挖掘,.NET核心2.1+:

在startup.cs中将以下内容添加到public void configureservices(…)中:

1
services.AddHttpContextAccessor();

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

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

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