Метод BeginInvoke и состояние сеанса - PullRequest
0 голосов
/ 23 февраля 2011

Я вызываю асинхронный вызов PageMethod со стороны клиента.Код бэкэнда:

[WebMethod(EnableSession = true)]
        public static string BeginMethodCall()
        { //Session Accessible here
            string g = Guid.NewGuid().ToString();                    
            Func<object> f = () => MethodCall();                

            IAsyncResult asyncCall = f.BeginInvoke(null, f);

            lock (AsyncThreadPool)
                AsyncThreadPool[g] = asyncCall;
            return g;
        }            

        [WebMethod(EnableSession=true)]
        public static object EndMethodCall(string guId)
        {
            IAsyncResult callResult;
            lock (AsyncThreadPool)
            {
                callResult = AsyncThreadPool[guId];
                AsyncThreadPool.Remove(guId);
            }

            Func<object> f = (Func<object>)callResult.AsyncState;
            callResult.AsyncWaitHandle.WaitOne();

            return f.EndInvoke(callResult);
        }

        [WebMethod(EnableSession = true)]
        public static object MethodCall()
        {
            //Session not accessible here
        }

Состояние сеанса доступно из BeginMethodCall() и EndMethodCall(), но не из MethodCall().

Может кто-нибудь сказать мне, почему я теряю свое состояние сеанса здесь?

  1. Потери потоков теряют контекст сеанса, потому что асинхронные вызовы не являются потокобезопасными?
  2. Есть ли здесь способ доступа к сеансу?

Ответы [ 2 ]

0 голосов
/ 08 мая 2012

В общем,

Session + Async = fail

Вы в безопасности в обратных вызовах и перед тем, как переходить в асинхронный код, но пока вы работаете параллельно, вы неполучить полное состояние сеанса.

Однако есть несколько обходных путей.Самым простым из них является

[SessionState(System.Web.SessionStateBehavior.ReadOnly)]

на уровне контроллера, который обеспечивает, очевидно, доступ только для чтения к значениям сеанса.Он будет работать параллельно, пока вы не попытаетесь записать в сессию.Вы также можете реализовать свой собственный HttpHandler, но это немного сложнее.

0 голосов
/ 07 марта 2011

В случае, если кто-то может найти это полезным

BeginXXX действительно создает новое theard, и потоки не являются безопасными для сеанса по очевидным причинам

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