Как получить доступ к HttpContext за пределами контроллеров в ASP.NET MVC?

В частности, переменные сеанса. У меня есть .ashx в моем проекте ASP.NET MVC, который тянет некоторые данные изображения для отображения пользователю, и мне нужно иметь доступ к объекту, который я сохранил в сеансе. Из контроллеров я могу потянуть объект в порядке, но на моей странице ashx контекст. Сессия равна 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
        }
    }

Ответы

Ответ 1

Хорошо, так что мне все-таки пришлось делать.... в моем файле ashx, я добавил в интерфейс IReadOnlySessionState, и он будет очень просто получать доступ к состоянию сеанса. Итак, это выглядит примерно так...

  public class getIcon : IHttpHandler, IReadOnlySessionState

Ответ 2

Вы должны импортировать сборку 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;

Попробуйте.