For anyone who runs into the same problem, I finally found that the
HttpContext variable within the controller EndAsyncTest() method was
being set correctly, but HttpContext.Current was null for some reason.
By putting "HttpContext.Current = HttpContext;" in the EndAsyncTest()
method at any point, the scope was able to be successfully disposed of
using my own OnEndRequest method or the SessionScopeWebModule:

                public void EndAsyncTest() {
                        HttpContext.Current = HttpContext;
                        Flash["message"] =
asynctestTask.EndInvoke(ControllerContext.Async.Result);
                        RedirectToAction("index");
                }

Thanks,
Brian

On Jun 23, 1:40 pm, bluesliverx <[email protected]> wrote:
> After some more digging, I've tracked the problem down to the fact
> that HttpContext.Current is null.  Somehow, Context (in the
> OnEndRequest method in my global application) is still non-null, but
> if I attempt to remove the scope from there, it tells me that it is
> not the currently registered scope.  This works fine when compiling in
> VS2010, but not under mono in Windows or Linux.  As I'm not an expert
> in ASP.NET and Mono, I'm at a standstill with async methods until I
> can figure this out.
>
> Perhaps I could ask everyone a different question: I can merely check
> to see if HttpContext.Current is null and then skip disposing of the
> scope if it is.  Will this leave open connections to the database or
> have performance or other implications if I don't dispose of the
> correct scope?
>
> Thanks for your help,
> Brian
>
> On Jun 14, 4:04 pm, bluesliverx <[email protected]> wrote:
>
>
>
> > Hello all,
>
> > No matter what I try, I can't seem to get the hybrid web scope working
> > with an asynchronous action when using Mono (tested on 2.6.1, 2.6.3,
> > and 2.6.4).  Each time I get a NullRefEx in either the OnEndRequest
> > method or the SessionScopeWebModule.  Here is the stacktrace running
> > locally on a windows machine using XSP2:
>
> > System.NullReferenceException: Object reference not set to an instance
> > of an object
> >   at [MyApp].Global.OnEndRequest (System.Object sender,
> > System.EventArgs e) [0x00000] in <filename unknown>:0
> >   at (wrapper delegate-invoke)
> > System.EventHandler:invoke_void__this___object_EventArgs
> > (object,System.EventArgs)
> >   at (wrapper delegate-invoke)
> > System.EventHandler:invoke_void__this___object_EventArgs
> > (object,System.EventArgs)
> >   at (wrapper delegate-invoke)
> > System.EventHandler:invoke_void__this___object_EventArgs
> > (object,System.EventArgs)
> >   at System.Web.HttpApplication.PipelineDone () [0x0001c] in C:\cygwin
> > \tmp\monobuild\build\BUILD\mono-2.6.4\mcs\class\System.Web\System.Web
> > \HttpApplication.cs:1106
>
> > Here is the same stack trace using mod_mono on Ubuntu, notice on this
> > one I was using the SessionScopeWebModule:
>
> > System.NullReferenceException: Object reference not set to an instance
> > of an object
> >   at Castle.ActiveRecord.Framework.SessionScopeWebModule.OnEndRequest
> > (System.Object sender, System.EventArgs e) [0x00000] in <filename
> > unknown>:0
> >   at (wrapper delegate-invoke)
> > System.EventHandler:invoke_void__this___object_EventArgs
> > (object,System.EventArgs)
> >   at System.Web.HttpApplication.PipelineDone () [0x00000] in <filename
> > unknown>:0
>
> > I tried both methods (writing my own OnBegin/OnEndRequest methods and
> > SessionScopeWebModule) since I thought it may at first have been the
> > module causing the problem.
>
> > The asynchronous action is a simple example:
>
> >         public class TasksController : ARSmartDispatchController {
> >                 public TasksController()
> >                         : base() {
> >                         asynctestTask = AsyncTestTaskRun;
> >                 }
> >                 private delegate string AsyncTestTask();
> >                 private readonly AsyncTestTask asynctestTask;
> >                 private string AsyncTestTaskRun() {
> >                         System.Threading.Thread.Sleep(250);
> >                         return "Async Test Finished Successfully";
> >                 }
>
> >                 public IAsyncResult BeginAsyncTest() {
> >                         return 
> > asynctestTask.BeginInvoke(ControllerContext.Async.Callback,
> > ControllerContext.Async.State);
> >                 }
>
> >                 public void EndAsyncTest() {
> >                         Flash["message"] =
> > asynctestTask.EndInvoke(ControllerContext.Async.Result);
> >                         RedirectToAction("index");
> >                 }
> >         }
>
> > Any ideas on this one?  I've tried many things to get this working,
> > and I do have the HybridWebThreadScopeInfo configured on my
> > activerecord:
> >   <activerecord isWeb="true"
> > threadinfotype="Castle.ActiveRecord.Framework.Scopes.HybridWebThreadScopeIn 
> > fo,
> > Castle.ActiveRecord">
> >      ....
> >   </activerecord>
>
> > Thanks!
> > -Brian

-- 
You received this message because you are subscribed to the Google Groups 
"Castle Project Users" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/castle-project-users?hl=en.

Reply via email to