Как получить доступ к HttpContext вне контроллеров в ASP.NET MVC? - PullRequest
17 голосов
/ 17 декабря 2009

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

Ответы [ 4 ]

22 голосов
/ 17 декабря 2009

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

Дайте ему попытку.

2 голосов
/ 17 декабря 2009

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

  public class getIcon : IHttpHandler, IReadOnlySessionState
1 голос
/ 11 февраля 2019

В ядре .Net лучший способ получить доступ к HTTPContext вне контроллера - использовать IHttpContextAccessor. Используя DI, мы можем получить доступ, например, к объектам User / HttpContext, таким как _httpContextAccessor.HttpContext.User и _httpContextAccessor.HttpContext.HttpContext. Для подробного ответа, пожалуйста, перейдите по этой ссылке . Спасибо!

0 голосов
/ 13 марта 2019

Чтобы никого не копать, для .net core 2.1 +:

Добавьте следующее к общедоступному void ConfigureServices (...) в вашем Startup.cs:

services.AddHttpContextAccessor();

Используйте, введя в ваш сервис / etc:

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

Благодаря: https://adamstorr.azurewebsites.net/blog/are-you-registering-ihttpcontextaccessor-correctly

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...