Как установить переменную сеанса в файле ASHX

Я пытаюсь установить переменную сеанса в файле ASHX. Я немного прочитал об этом и дошел до этого:

  1. Я установил переменную в файле ASPX, который вызывает обработчик ASHX.
  2. Я попытался сбросить переменную в обработчике.

Я получаю сообщение об ошибке, что «System.Web.HttpContext.Current.Session» имеет значение null. Как я уже сказал, я кое-что прочитал, и кажется, что это должно сработать, но по какой-то причине я просто не могу заставить его работать для меня.

Я добавил using System.Web.SessionState; в верхней части моего обработчика, но это, похоже, не помогло. Переменная сеанса (HttpContext.Current.Session ["saml_session_id"]) устанавливается с этим, но, похоже, не сохраняется. Когда я перехожу к aspx-файлу и вызываю HttpContext.Current.Session ["saml_session_id"] из моего непосредственного окна, возвращается только NULL.

Я использовал это в качестве руководства (Как получить доступ к сеансу в файле .ashx?), но явно чего-то не хватает.

Кто-нибудь может мне посоветовать? Я продолжу исследование, и если я решу эту проблему, опубликую решение.

Смотрите мой код ниже.

В моем файле .aspx я объявляю свою переменную сеанса:

HttpContext.Current.Session["saml_session_id"] = string.Empty;

Затем в том же файле я отправляю в файл ashx:

var response = Post("http://" + Request.ServerVariables["HTTP_HOST"].ToString() + "/API/Login.ashx", new NameValueCollection() {
            {"Username",Username},
            {"Password",Password}
        });

Затем в моем файле ashx у меня есть следующее (это урезанная версия):

using System.Web.SessionState;

//Some validation happens and a string called session_id gets generated.

context.Session["saml_session_id"] = session_id;

//while I'm in the ashx file, context.Session["saml_session_id"] persists.

Когда запрос в обработчике завершит обработку, следующий код в файле ASPX будет следующим:

  if (Response.Status.ToString() == "200 OK") {
            Context.Response.Redirect("../Play.aspx?SessionId=" + HttpContext.Current.Session["saml_session_id"].ToString());
        }

Но HttpContext.Current.Session ["saml_session_id"]. ToString () теперь снова пуст. По сути, похоже, что обработчик и веб-форма не обмениваются данными или сеанс не используется совместно. Я проверил, совпадает ли пространство имен. Что еще я должен проверить?


person kickinchicken    schedule 13.01.2015    source источник
comment
Почему вы публикуете код на стороне сервера в один и тот же код, а не просто вызываете код напрямую? Я предполагаю, что, поскольку сервер отправляет данные, а не пользователь, это рассматривается как новый сеанс. Вы должны либо отправить клиенту данные, либо просто вызвать код на стороне сервера напрямую из вашего собственного кода в коде позади.   -  person mason    schedule 13.01.2015
comment
Спасибо - я пришел к аналогичному осознанию насчет новой сессии. Это код, который я унаследовал, и я пытаюсь реализовать вызов SAML, используя ту же логику аутентификации. Публикация начальной формы выполняется через jquery. Вместо этого я реализую вызов SAML - проверяю правильность утверждения и затем отправляю его в исходный файл ASHX. Думаю, я просто установлю cookie и покончу с этим. Я выложу свое решение.   -  person kickinchicken    schedule 13.01.2015


Ответы (3)


Убедитесь, что обработчик наследуется от System.Web.SessionState.IRequiresSessionState, как в предоставленной вами ссылке.

Вам не нужно иметь HttpContext.Current часть, если вы импортируете пространство имен.

public class ImageHandler : IHttpHandler, System.Web.SessionState.IRequiresSessionState
{
    public void ProcessRequest(HttpContext context)
    {
      string Name = "";
      if (context.Session["filename"] != null)
         Name = context.Session["filename"].ToString();
    }
}
person mason    schedule 13.01.2015
comment
@kickinchicken Поместите свой код в вопрос, а не в комментарий. И, пожалуйста, поймите, что вы должны были включить его в первую очередь, нам не нужно спрашивать ваш код, когда возникает вопрос, почему ваш код не работает. - person mason; 13.01.2015
comment
Мейсон, я поставил это под вопрос. Прошу прощения за то, что так сильно вас обидел. Пожалуйста, приглушите его немного. Если вы заметили, я действительно ответил на некоторые из моих вопросов здесь. Это сообщество людей, которые помогают друг другу. Если вы собираетесь вести себя нетерпеливо и унизительно, пожалуйста, просто не отвечайте, потому что это бесполезно. - person kickinchicken; 13.01.2015
comment
@kickinchicken Я не обиделась - я пытаюсь тебе помочь. Если вы хотите получить достойную помощь, важно научиться правильно задавать вопрос. - person mason; 13.01.2015

Все, что вам нужно сделать, это импортировать

IRequiresSessionState

затем добавьте свои данные:

context.Session.Add("User", "Your Object");

person Kai CriticallyAcclaimed Cooper    schedule 28.02.2017

Проблема заключалась в ошибке новичка: я получал ответ из формы, но искал не в том месте. Оказалось, что это было в байтах, и там был идентификатор сеанса из файла ASHX.

person kickinchicken    schedule 14.01.2015