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

时间:2009-12-16 22:32:05

标签: asp.net asp.net-mvc

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

这是我正在尝试做的一个例子...... 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
        }
    }

4 个答案:

答案 0 :(得分:22)

您必须在代码中导入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;

试一试。

答案 1 :(得分:2)

好的,所以我最终要做的....在我的ashx文件中,我添加了IReadOnlySessionState接口,它将访问会话状态就好了。所以它看起来像这样......

  public class getIcon : IHttpHandler, IReadOnlySessionState

答案 2 :(得分:1)

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

答案 3 :(得分:0)

要为.net core 2.1+节省任何人的挖掘工作:

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

services.AddHttpContextAccessor();

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

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

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