15. februar 2007 - 10:04Der er
25 kommentarer og 1 løsning
Problem med stateserver (Session) og ICallBackEventHandler
Jeg har lavet en realtime progressbar på et site, det hele spiller fint når jeg køre mine sessioner i InProc mode. Nu er der så kommet et krav til løsningen af den skal bruges Session ved hjælp af stateserver og så virker min progressbar ikke mere. Hvordan kan jeg om gå dette?
Jeg bruger sessioner i forbinbdels med ICallBackEventhandler til at gemme diverse variabler.
ved ikke helt præcist om du har inddraget dine egne klasser, men har en kommentar og måske kan det give dig noget og hvis ikke så ignorere du den bare:)
Når du arbejder med InProc gemmes oplysninger "In Memory" altså i hukommelsen, men skifter du til stateserver skal det gemmes på disc. Derfor skal dine klasser (hvis du prøver at gemme sådan noget) markeres som [Serializable]
Har du kigget på denne artikel http://msdn2.microsoft.com/en-us/library/ms178586.aspx ? Du skal sikre dig at state serveren er sat ordentligt op og systemroot\Microsoft.NET\Framework\versionNumber\aspnet_state.exe skal kører.
Jeg sætter en session for hvert gennemløb af en løkke (i den metode der udføre arbejdet) den session henter jeg så i "string ICallbackEventHandler.GetCallbackResult()".
Jeg bruger session's mange andre steder i min løsning og der virker det fint.
Så er det sikkert fordi at session state på siden ikke bliver opdateret, kunne jeg forestille mig. Sender du værdien af session tilbage til siden med icallback ?
Nej værdien på session bliver ikke sat i forbindelse med callback. værdien bliver returneret i forbindelse med callback (eks. 25 for at processen er nået 25%)
Prøv at udskrive værdien i din call back og se om den ændre sig der. Altså efter du har sat den. Jeg formoder at du sender et callback fra siden med et bestemt interval for at finde ud af hvor langt dit "job" er noget i så sætter du en % værdi og siden modtager svar fra serveren opdaterer du din progress bar med javascript. Er det en nogenlunde rigtig antagelse ? Virker dine sessioner andre steder med clientscript callback ?
Du skal sende dine værdier tilbage til siden via javascript og så bruge en delimiter til at hente hvad der er relevant ud og vise det. Jeg gætter på at du beregner progress i din codebehind.
Jeg starter en metoden der skal udføre arbejdet asynkront, for at den så kan kommunikere med mit CallBack fra front-end er jeg nødtil at bruge en session.
private IAsyncResult DoJobAsync() { DoJobDelegate doDelegate = new DoJobDelegate(MinMetodeDerUdføreArbejdet); IAsyncResult ar = doDelegate.BeginInvoke(new AsyncCallback(MyCallback), null); return ar; }
Når man så laver den lille finte så går det galt igen, for i min callback metode til min asynkrone metode er HttpContext.Current.User.Identity.Name = null.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.