______________________
By the way the error message is (sorry for swedish language in the
message):
System.ObjectDisposedException was unhandled by user code
Message="Session is closed!\r\nObjektnamn: ISession."
Source="NHibernate"
ObjectName="ISession"
StackTrace:
vid NHibernate.Impl.AbstractSessionImpl.ErrorIfClosed()
vid
NHibernate.Impl.AbstractSessionImpl.CheckAndUpdateSessionStatus()
vid NHibernate.Impl.SessionImpl.CreateCriteria(Type
persistentClass, String alias)
vid
WebMonitorUpdate.Models.NHDataAccessObjects.OnlineSystemDAO.findByUsername
(String username) i C:\Projects\WebMonitorUpdate\WebMonitorUpdate
\Models\NHDataAccessObjects\OnlineSystemDAO.cs:rad 55
vid
WebMonitorUpdate.SQLServerServices.OnlineSystemService.getCustomerInfoByName
(String username) i C:\Projects\WebMonitorUpdate\WebMonitorUpdate
\SQLServerServices\OnlineSystemService.cs:rad 33
vid
WebMonitorUpdate.MembershipServicesImpl.SQLServerMembershipProvider.ValidateUser
(String usernameAndSystemId, String password) i C:\Projects
\WebMonitorUpdate\WebMonitorUpdate\MembershipServicesImpl
\SQLServerMembershipProvider.cs:rad 139
vid
WebMonitorUpdate.MembershipServicesImpl.AccountMembershipService.ValidateUser
(String systemId, String userName, String password) i C:\Projects
\WebMonitorUpdate\WebMonitorUpdate\MembershipServicesImpl
\AccountMembershipService.cs:rad 32
vid WebMonitorUpdate.Validators.AccountValidators.ValidateLogOn
(String systemId, String userName, String password, IMembershipService
membershipService, ModelStateDictionary modelState) i C:\Projects
\WebMonitorUpdate\WebMonitorUpdate\Validators\AccountValidators.cs:rad
50
vid WebMonitorUpdate.Controllers.AccountController.LogOn(String
systemId, String userName, String password, Boolean rememberMe, String
returnUrl) i C:\Projects\WebMonitorUpdate\WebMonitorUpdate\Controllers
\AccountController.cs:rad 70
vid lambda_method(ExecutionScope , ControllerBase , Object[] )
vid System.Web.Mvc.ActionMethodDispatcher.Execute
(ControllerBase controller, Object[] parameters)
vid System.Web.Mvc.ReflectedActionDescriptor.Execute
(ControllerContext controllerContext, IDictionary`2 parameters)
vid System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod
(ControllerContext controllerContext, ActionDescriptor
actionDescriptor, IDictionary`2 parameters)
vid
System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassa.<InvokeActionMethodWithFilters>b__7
()
vid
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter
(IActionFilter filter, ActionExecutingContext preContext, Func`1
continuation)
vid
System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassa.<>c__DisplayClassc.<InvokeActionMethodWithFilters>b__9
()
vid
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters
(ControllerContext controllerContext, IList`1 filters,
ActionDescriptor actionDescriptor, IDictionary`2 parameters)
vid System.Web.Mvc.ControllerActionInvoker.InvokeAction
(ControllerContext controllerContext, String actionName)
vid System.Web.Mvc.Controller.ExecuteCore()
vid System.Web.Mvc.ControllerBase.Execute(RequestContext
requestContext)
vid
System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute
(RequestContext requestContext)
vid System.Web.Mvc.MvcHandler.ProcessRequest(HttpContextBase
httpContext)
vid System.Web.Mvc.MvcHandler.ProcessRequest(HttpContext
httpContext)
vid
System.Web.Mvc.MvcHandler.System.Web.IHttpHandler.ProcessRequest
(HttpContext httpContext)
vid System.Web.Mvc.MvcHttpHandler.VerifyAndProcessRequest
(IHttpHandler httpHandler, HttpContextBase httpContext)
vid System.Web.Routing.UrlRoutingHandler.ProcessRequest
(HttpContextBase httpContext)
vid System.Web.Routing.UrlRoutingHandler.ProcessRequest
(HttpContext httpContext)
vid
System.Web.Routing.UrlRoutingHandler.System.Web.IHttpHandler.ProcessRequest
(HttpContext context)
vid WebMonitorUpdate._Default.Page_Load(Object sender,
EventArgs e) i C:\Projects\WebMonitorUpdate\WebMonitorUpdate
\Default.aspx.cs:rad 18
vid System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr
fp, Object o, Object t, EventArgs e)
vid System.Web.Util.CalliEventHandlerDelegateProxy.Callback
(Object sender, EventArgs e)
vid System.Web.UI.Control.OnLoad(EventArgs e)
vid System.Web.UI.Control.LoadRecursive()
vid System.Web.UI.Page.ProcessRequestMain(Boolean
includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
InnerException:
______________________
On 26 Jan, 21:41, Sheri <[email protected]> wrote:
> Thanks a lot Jason for you help.
> Sorry for my disturbance.
>
> ((just a point to them who would like to use NH 2.1.2.4000 and latest
> Castle versions, NHibernate.ByteCode.Castle source code should be
> built by the latest version of Castle.Core and Castle.DynamicProxy2.))
>
> I use IHttpModule to open/close session but I get "Session Closed"
> error.
>
> 1. web.config: I have current_session_context_class = web & <add
> name="SessionScope" type="MyPackage.Helper.SessionScope, MyPackage"/>
> in my httpModule section
> 2. I have a daoFactory which is registered in container. this
> daoFactory initialize all my DAOs. (But I do not have registered my
> dao in the container directly. DAO classes are for CRUD operation)
> 3. I have some services classes which has some dao as object for other
> process with retrieved data from DAOs. In these services classes I
> have initialized each dao through daofactory
> 4. All my daos is inserted in castle section of web.config
>
> I do not know why I get "session closed error". The only thing I can
> guess is registration in container which I have some trouble to
> understand.
> SessionScope (that implements IHttpModule) should retrieve and close
> session byself? or?
>
> Thanks for any help
>
> Regards
> Sheri
>
> On 25 Jan, 14:49, Jason Meckley <[email protected]> wrote:
>
>
>
> > Sheri, this has been my approach with registering NH in Windsor.
>
> > public NhibernateFacility : AbstractFacility
> > {
> > public override void Init()
> > {
> > var configuration = new Configuration().Configure();
> > var factory = configuration.BuildSessionFactory();
> > Kernel.AddComponentInstance("nhibernate_configuration",
> > configuration);
> > Kernel.AddComponentInstance("session_factory", );
> > Kernel.Resolvers.Add(NhibernateSessionResolver(Kernel));
> > //I could also use the factory method to resolve the
> > session, but
> > that can cause a memory leak if i don't also implement
> > //a custom lifecyle for it. It's easier just to resolve the
> > session
> > with sub dependency resolver.
> > //It's also easier to test in isolation.
> > }
>
> > }
>
> > public NhibernateSessionResolver : ISubDependencyResolver
> > {
> > private readonly IKernel kernel;
>
> > public NhibernateSessionResolver(IKernel kernel)
> > {
> > this.kernel = kernel;
> > }
>
> > public bool Resolve(CreationContext context, ISubDependencyResolver
> > contextHandlerResolver, ComponentModel model, DependencyModel
> > dependency)
> > {
> > return
> > kernel.Resolve<ISessionFactory>().GetCurrentSession();
> > }
>
> > public bool CanResolve(CreationContext context,
> > ISubDependencyResolver contextHandlerResolver, ComponentModel model,
> > DependencyModel dependency)
> > {
> > return
> > typeof(ISession).IsAssignableFrom(dependency.TargetType);
> > }
>
> > }
>
> > new Configuration().Configure() will automatically load the
> > hibernate.config file from the root directory of the project. part of
> > this configuration will be a property defining the
> > CurrentSessionContext web, thread, map, etc. the best choice for this
> > will depend on where you are using this configuration. With this is
> > place I can now inject a session into other objects.
>
> > public class Foo
> > {
> > private readonly ISession session;
>
> > public Foo(ISession session)
> > {
> > this.session = session;
> > }}
>
> > I can then register Foo into the container as well with a transient
> > lifestyle and all will be resolved for me automatically.
>
> > The next piece to consider is managing when to open/close the session.
> > I work with web applications and use an HttpModule to manage the
> > session.
> > public class SessionScope : IHttpModule
> > {
> > public void Init(HttpApplication context)
> > {
> > context.BeginRequest += OpenSession;
> > context.EndRequest += CloseSession;
> > }
>
> > private void OpenSession(object sender, EventArgs e)
> > {
> > var factory = WindsorContainerAccessorUtil.ObtainConatiner
> > ().Resolve<ISessionFactory>();
> > CurrentSessionContext.Bind(factory.OpenSession());
> > }
>
> > private void CloseSession(object sender, EventArgs e)
> > {
> > var factory = WindsorContainerAccessorUtil.ObtainConatiner
> > ().Resolve<ISessionFactory>();
> > if (!CurrentSessionContext.HasBind(factory)) return;
>
> > var session = CurrentSessionContext.Unbind(factory);
> > session.Dispose();;
> > }}
>
> > and I register this module in web.config. then I need to manage my
> > transactions. I use Monorail as my web framework and create a filter
> > to manage this.
> > public class TransactionFilter : Filter
> > {
> > private readonly ISession session;
>
> > public TransactionFilter(ISession session)
> > {
> > this.session = session;
> > }
>
> > protected override bool OnBeforeAction(IEngineContext context,
> > IController controller, IControllerContext, controllerContext)
> > {
> > session.BeginTransaction();
> > return base.OnBeforeTransaction();
> > }
>
> > protected override void OnAfterAction(IEngineContext context,
> > IController controller, IControllerContext, controllerContext)
> > {
> > using(session.Transaction)
> > {
> > if(context.LastException == null)
> > {
> > session.Transaction.Commit;
> > }
> > else
> > {
> > session.Transaction.Rollback();
> > }
> > }
> > }}
>
> > Each Controller/ViewComponent action then becomes it's own unit of
> > work. This drives the design of the workflow within each action.
> > I then register the TransactionFilter in the Kernel as transient and
> > place a FilterAttribute for the TransactionFilter on any controller
> > that requires is. If I don't need a transaction for a specific action
> > i can apply the SkipFilter attribute to that action.
>
> > On Jan 25, 5:03 am, Sheri <[email protected]> wrote:
>
> > > Hi!
>
> > > How can I register the sessionfactory in IKernel?
>
> > > API in the documentation is not enough for me.
>
> > > I have a class as following:
>
> > > ______________________________
> > > using System.Web;
> > > using NHibernate;
> > > using NHibernate.Cfg;
>
> > > namespace WebMonitorUpdate.SQLServerServices
> > > {
> > > public sealed class DBConnectionService
> > > {
> > > static readonly DBConnectionService instance = new
> > > DBConnectionService();
> > > private const string CurrentSessionKey = "_session";
> > > private static readonly ISessionFactory sessionFactory;
>
> > > static DBConnectionService()
> > > {
> > > if(DBConnectionService.sessionFactory == null)
> > > sessionFactory = new Configuration().Configure
> > > ().BuildSessionFactory();
> > > }
>
> > > DBConnectionService()
> > > {
> > > }
>
> > > public static DBConnectionService Instance
> > > {
> > > get
> > > {
> > > return instance;
> > > }
> > > }
>
> > > public ISession OpenSession()
> > > {
> > > HttpContext context = HttpContext.Current;
> > > ISession currentSession = context.Items[CurrentSessionKey]
> > > as ISession;
>
> > > if (currentSession == null)
> > > {
> > > currentSession = sessionFactory.OpenSession();
> > > context.Items[CurrentSessionKey] = currentSession;
> > > }
>
> > > return currentSession;
> > > }
>
> > > public void CloseSession()
> > > {
> > > HttpContext context = HttpContext.Current;
> > > if (context == null) return;
> > > ISession currentSession = context.Items[CurrentSessionKey]
> > > as ISession;
>
> > > if (currentSession == null)
> > > {
> > > // No current session
> > > return;
> > > }
>
> > > currentSession.Close();
> > > context.Items.Remove(CurrentSessionKey);
> > > }
>
> > > public void CloseSessionFactory()
> > > {
> > > if (sessionFactory != null)
> > > {
> > > sessionFactory.Close();
> > > }
> > > }
> > > }}
>
> > > _________________________________
>
> > > And I will register this class in the IKernel. could I do this? how?
> > > if no, what do I missing here?!
>
> > > Thanks in advance
> > > Sheri
>
> > > On 21 Jan, 19:42, Jason Meckley <[email protected]> wrote:
>
> > > > there are 2 configurations in this scenario. Nhibernate andCastle.
> > > > Nhibernate configuration is very easy to figure out using the xml
> > > > schema docs.Castle, on the other hand is very open ended. the
> > > > documentation (found
> > > > herehttp://www.castleproject.org/container/documentation/v21/index.html)
> > > > is the best place to start. because each facility/component...
>
> läs mer »
--
You received this message because you are subscribed to the Google Groups
"nhusers" 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/nhusers?hl=en.