2015-01-13 5 views
0

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

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

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

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

Я использовал это как руководство (How to access Session in .ashx file?), но, очевидно, что-то не хватает.

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

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

В моем файле .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. 

Когда запрос в обработчике закончен proc эссинга, следующий код в файле 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() теперь пусто снова.. В принципе, похоже, что обработчик и веб-форма не сообщаются или сеанс не используется. Я проверил, чтобы пространство имен было одинаковым. Что-нибудь еще я должен проверить?

+0

Почему вы проводки с сервера кода на стороне в том же коде, а не просто призывающую код напрямую? Я предполагаю, что, поскольку сервер отправляет данные, а не пользователь, он рассматривается как новый сеанс. Вы должны либо отправить сообщение клиенту, либо просто вызвать код на стороне сервера из вашего собственного кода в коде. – mason

+0

Спасибо - я пришел к аналогичной реализации о новом сеансе. Это код, который я унаследовал, и я пытаюсь реализовать вызов SAML с использованием той же логики аутентификации. Письмо с исходной формой выполняется через jquery. Вместо этого я реализую вызов SAML - проверка правильности утверждения и последующая публикация в исходном файле ASHX. Я думаю, что я просто поставлю куки-файл и сделаю это. Я отправлю свое решение. – kickinchicken

ответ

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(); 
    } 
} 
+1

@kickinchicken Поместите свой код в вопрос, а не в комментарии. И, пожалуйста, поймите, что вы должны были включить его в первую очередь, нам не нужно будет запрашивать ваш код, когда возникает вопрос, почему ваш код не работает. – mason

+0

Мейсон. Я поставил вопрос. Прошу прощения за то, что так сильно обидел тебя. Пожалуйста, немного смягчите его. Если вы заметили, что я действительно ответил на некоторые из моих собственных вопросов здесь. Это сообщество для людей, чтобы помогать друг другу. Если вы будете нетерпеливы и уничижительны, просто не отвечайте, потому что это не полезно. – kickinchicken

+1

@kickinchicken Я не обижаюсь - я пытаюсь вам помочь. Важно, чтобы вы научились правильно задавать вопрос, хотите ли вы получить достойную помощь. – mason

-1

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

0

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

IRequiresSessionState

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

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

Смежные вопросы