2011-02-03 2 views
17

У меня проблема с GenericHandler и anonymousIdentification.ASP.NET Общие обработчики и сеанс

В принципе, если <anonymousIdentification enabled="true" /> включен в веб-конфигурации, всякий раз, когда на сервер отправляется запрос JQuery GET/POST, этот запрос выполняется под новым пользователем и с новым сеансом пользователя.

Есть ли способ смягчить это? Мне нужно получить доступ к переменным сеанса текущего пользователя ... Это действительно расстраивает!

+0

Я не проверил это, но я думаю, если вы отправляете JQuery GET REQ. от Клиента, тогда он обрабатывается в текущем контексте пользователя. check with fiddler - это cookie-сессия ASP.net, как для обычного, так и для jquery-запроса. –

+0

Итак, если вы отключите анонимный идентификатор, он работает? Вы используете Forms auth? Можете ли вы отключить anon для этого конкретного пути в web.config? – jcolebrand

+0

Я попытаюсь посмотреть, работает ли это @drachenstern. Вы ошибаетесь @Shekhar_Pro. Я храню пользовательские данные в сеансе; одним значением является UserRegistratinoState. Если я пришел со страницы, где пользователь только что зарегистрировал значение перечисления в сеансе, это UserRegistrationState.Registered. Я проверил это. Однако, когда я вызываю обработчик из js на другой странице, первая строка кода в обработчике проверяет эту переменную сеанса. Если переменная не существует, она автоматически возвращает UserRegistrationState.Anonymous. Я думаю, можно с уверенностью предположить, что запросы Get от JQuery выполняются под новым пользователем. – bleepzter

ответ

38

Общие обработчики должны реализовать интерфейс IReadOnlySessionState для доступа к переменным сеанса. Если вам также необходимо написать переменные сеанса, выполните команду IRequiresSessionState.

+1

Я попробую это через мгновение. Спасибо @Josh Stodola – bleepzter

+2

Должно читать: ** публичный класс MemberHandler: IHttpHandler, IRequiresSessionState ** –

+0

У меня была проблема с тем, что обработчик не отправил обратно cookie сессии, если запрос обработчику был первым на веб-сайте (без фактического идентификатора сеанса) и Я думал, что когда «IReadOnlySessionState» происходит от «IRequireSessionState», которого будет достаточно. Но я действительно должен был использовать 'IRequireSessionState' явно. Спасибо за этот пост. – jgasiorowski

-2

Я предлагаю в веб-браузере включить вкладку сети в режиме разработчика. Затем проверьте AJAX, какой файл cookie отправлен (если есть).

Если вы не видите никакого файла cookie, это означает, что браузер не получил никакой сессии, поэтому вы должны убедиться (как указано Джошем) наследовать правый интерфейс и получить доступ к файлу cookie. (Don'f забудьте использовать System.Web.SessionState)

Для того, чтобы создать печенье, доступ SESSIONID объекта сессии в:

string sesId = context.Session.SessionID; 

Перед вы написать что-нибудь в ответ.

+1

-1 Очень возможно и правдоподобно иметь состояние без cooki-состояния, и доступ к идентификатору, конечно же, не «сгенерирует» файл cookie –

+0

Это не то, что я сказал, снова прочитал. –

+0

Я читал его три раза. Мне больше не нужно его читать. –

1

Вы можете использовать это:

public class Handler : 
    IHttpHandler, 
    System.Web.SessionState.IReadOnlySessionState 
11

Реализовать интерфейс System.Web.SessionState.IRequiresSessionState:

public class Handler : IHttpHandler, System.Web.SessionState.IRequiresSessionState 
{ 
    public void ProcessRequest(HttpContext context) 
    {  
    context.Session["StackOverflow"] = "overflowing";  
    context.Response.Redirect("~/AnotherPage.aspx");  
    } 

} 
+0

Я хочу получить значения сеанса в общем обработчике для загрузки изображения с первичным ключом, который я сохранил в сеансе, я использую плагин для загрузки изображений jquery и связывает все свойства готового документа. Я использовал iRequiresSessionState в моем коде обработчика, но все же я не могу получить доступ к значениям сеанса. ключи сеанса все еще 0. Может ли кто-нибудь рассказать мне об этом? –

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