Сессия закрыта !, Имя объекта: ISession - Rhino Security and Sharp Architecture - PullRequest
0 голосов
/ 24 октября 2011

У меня проблема с закрытой, но не удаленной сессией NHibernate внутри Rhino Security.Похоже, что Виндзор передает закрытую сессию службе авторизации.Проблема не возникает, пока второй вызов метода ниже.Первый звонок работает отлично.В контейнере Windsor все настроено для временного образа жизни.

Я использую Sharp Architecture 2.0 RC.

Вызывающая служба / задача обрабатывается тем же контейнером Windsor, что и AuthorizationRepository.

Любые мысли о том, что является причиной проблемы, будут высоко оценены?

namespace Rhino.Security.Services
{
public class AuthorizationRepository : IAuthorizationRepository
{
//...
public virtual UsersGroup[] GetAssociatedUsersGroupFor(IUser user)
        {
            ICollection<UsersGroup> usersGroups =
                SecurityCriterions.AllGroups(user)
                    .GetExecutableCriteria(session) //This session is closed and not connected when the line executes
                    .AddOrder(Order.Asc("Name"))
                    .SetCacheable(true)
                    .List<UsersGroup>();
            return usersGroups.ToArray(); //This line of code (ICollection...) throws the exception!!!
        }
//...
}}

Средство ISession выглядит следующим образом:

container.AddFacility<FactorySupportFacility>()
                .Register(Component.For<ISession>()
                .UsingFactoryMethod(() => NHibernateSession.Current)
                .LifeStyle.Is(LifestyleType.Transient));

Регистрация компонента безопасности Rhino выглядитнапример:

private static void AddRhinoSecurityComponentsTo(IWindsorContainer container)
        {
            // For RhinoSecurity
            container.Register(
                 Component.For<IAuthorizationService>()
                     .ImplementedBy<AuthorizationService>()
                     .LifeStyle.Is(LifestyleType.Transient),
                 Component.For<IAuthorizationRepository>()
                     .ImplementedBy<AuthorizationRepository>()
                     .LifeStyle.Is(LifestyleType.Transient),
                 Component.For<IPermissionsBuilderService>()
                     .ImplementedBy<PermissionsBuilderService>()
                     .LifeStyle.Is(LifestyleType.Transient),
                 Component.For<IPermissionsService>()
                     .ImplementedBy<PermissionsService>()
                    .LifeStyle.Is(LifestyleType.Transient)
                 );
        }

Метод, вызывающий AuthorizationService, является одним из двух следующих, в зависимости от:

SecurityHelper (1):

public static bool IsAllowed(string operation)
        {
            User user = (User)HttpContext.Current.Session["User"];

            IAuthorizationService authorizationService = ServiceLocator.Current.GetInstance<IAuthorizationService>();

            return authorizationService.IsAllowed(user as User, operation);

        }

SecurityTasks (2):

public UsersGroup[] GetAssociatedUsersGroupFor(IUser user)
        {
            return authRepository.GetAssociatedUsersGroupFor(user);
        }

Программа NHibernate Init выглядит следующим образом:

NHibernateSession.Init(
                this.webSessionStorage,
                new[] { Server.MapPath("~/bin/ClinicalTrials.Infrastructure.dll") },
                new AutoPersistenceModelGenerator().Generate(),
                Server.MapPath("~/NHibernate.config"));

ysod выглядит следующим образом:

Session is closed!
Object name: 'ISession'.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.ObjectDisposedException: Session is closed!
Object name: 'ISession'.

Source Error:

Line 329:       public virtual UsersGroup[] GetAssociatedUsersGroupFor(IUser user)
Line 330:       {
Line 331:           ICollection<UsersGroup> usersGroups =
Line 332:               SecurityCriterions.AllGroups(user)
Line 333:                   .GetExecutableCriteria(session)


Source File: ...\Rhino.Security - nHibernate 3.1\Rhino.Security\Services\AuthorizationRepository.cs    Line: 331

Stack Trace:

[ObjectDisposedException: Session is closed!
Object name: 'ISession'.]
   NHibernate.Impl.AbstractSessionImpl.ErrorIfClosed() +124
   NHibernate.Impl.AbstractSessionImpl.CheckAndUpdateSessionStatus() +31
   NHibernate.Impl.SessionImpl.List(CriteriaImpl criteria, IList results) +173
   NHibernate.Impl.CriteriaImpl.List(IList results) +80
   NHibernate.Impl.CriteriaImpl.List() +105
   Rhino.Security.Services.AuthorizationRepository.GetAssociatedUsersGroupFor(IUser user) in ...\Rhino.Security - nHibernate 3.1\Rhino.Security\Services\AuthorizationRepository.cs:331
   ClinicalTrialsAdmin.Tasks.SecurityTasks.GetAssociatedUsersGroupFor(IUser user) in ...\Source\Admin\Solutions\ClinicalTrialsAdmin.Tasks\SecurityTasks.cs:89
   ClinicalTrialsAdmin.Web.Mvc.Controllers.Permission.PermissionController.ShowUsers() in ...\Source\Admin\Solutions\ClinicalTrialsAdmin.Web.Mvc\Controllers\Permission\PermissionController.cs:228
   lambda_method(Closure , ControllerBase , Object[] ) +96
   System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +17
   System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +208
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +27
   System.Web.Mvc.<>c__DisplayClass15.<InvokeActionMethodWithFilters>b__12() +55
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +263
   System.Web.Mvc.<>c__DisplayClass17.<InvokeActionMethodWithFilters>b__14() +19
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +263
   System.Web.Mvc.<>c__DisplayClass17.<InvokeActionMethodWithFilters>b__14() +19
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +191
   System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +343
   System.Web.Mvc.Controller.ExecuteCore() +116
   System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +97
   System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +10
   System.Web.Mvc.<>c__DisplayClassb.<BeginProcessRequest>b__5() +37
   System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +21
   System.Web.Mvc.Async.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) +12
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +62
   System.Web.Mvc.<>c__DisplayClasse.<EndProcessRequest>b__d() +50
   System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(Action f) +7
   System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action) +22
   System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +60
   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9
   System.Web.Mvc.<>c__DisplayClassa.<EndProcessRequest>b__9() +23
   System.Web.Mvc.<>c__DisplayClass4.<Wrap>b__3() +12
   System.Web.Mvc.ServerExecuteHttpHandlerWrapper.Wrap(Func`1 func) +38
   System.Web.Mvc.ServerExecuteHttpHandlerWrapper.Wrap(Action action) +65
   System.Web.Mvc.ServerExecuteHttpHandlerAsyncWrapper.EndProcessRequest(IAsyncResult result) +71
   System.Web.HttpServerUtility.ExecuteInternal(IHttpHandler handler, TextWriter writer, Boolean preserveForm, Boolean setPreviousPage, VirtualPath path, VirtualPath filePath, String physPath, Exception error, String queryStringOverride) +1072

[HttpException (0x80004005): Error executing child request for handler 'System.Web.Mvc.HttpHandlerUtil+ServerExecuteHttpHandlerAsyncWrapper'.]
   System.Web.HttpServerUtility.ExecuteInternal(IHttpHandler handler, TextWriter writer, Boolean preserveForm, Boolean setPreviousPage, VirtualPath path, VirtualPath filePath, String physPath, Exception error, String queryStringOverride) +3058371
   System.Web.HttpServerUtility.Execute(IHttpHandler handler, TextWriter writer, Boolean preserveForm, Boolean setPreviousPage) +77
   System.Web.HttpServerUtility.Execute(IHttpHandler handler, TextWriter writer, Boolean preserveForm) +28
   System.Web.HttpServerUtilityWrapper.Execute(IHttpHandler handler, TextWriter writer, Boolean preserveForm) +22
   System.Web.Mvc.Html.ChildActionExtensions.ActionHelper(HtmlHelper htmlHelper, String actionName, String controllerName, RouteValueDictionary routeValues, TextWriter textWriter) +497
   System.Web.Mvc.Html.ChildActionExtensions.RenderAction(HtmlHelper htmlHelper, String actionName, String controllerName) +34
   ASP._Page_Views_Administration_Default_cshtml.Execute() in ...\Source\Admin\Solutions\ClinicalTrialsAdmin.Web.Mvc\Views\Administration\Default.cshtml:44
   System.Web.WebPages.WebPageBase.ExecutePageHierarchy() +207
   System.Web.Mvc.WebViewPage.ExecutePageHierarchy() +81
   System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage) +76
   System.Web.Mvc.RazorView.RenderView(ViewContext viewContext, TextWriter writer, Object instance) +220
   System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer) +115
   System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context) +303
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult) +13
   System.Web.Mvc.<>c__DisplayClass1c.<InvokeActionResultWithFilters>b__19() +23
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation) +260
   System.Web.Mvc.<>c__DisplayClass1e.<InvokeActionResultWithFilters>b__1b() +19
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation) +260
   System.Web.Mvc.<>c__DisplayClass1e.<InvokeActionResultWithFilters>b__1b() +19
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation) +260
   System.Web.Mvc.<>c__DisplayClass1e.<InvokeActionResultWithFilters>b__1b() +19
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult) +177
   System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +343
   System.Web.Mvc.Controller.ExecuteCore() +116
   System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +97
   System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +10
   System.Web.Mvc.<>c__DisplayClassb.<BeginProcessRequest>b__5() +37
   System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +21
   System.Web.Mvc.Async.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) +12
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +62
   System.Web.Mvc.<>c__DisplayClasse.<EndProcessRequest>b__d() +50
   System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(Action f) +7
   System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action) +22
   System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +60
   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8963149
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +184

Похоже, что сеансзакрыт где-то при переходе между страницей _layout.cshtml и наследующей страницей .cshtml.Это нормально?Мне не хватает какого-либо способа управления тем, как и когда закрывается сессия, или как Windsor обрабатывает сессию?

Последний открытый стек вызовов:

>   Rhino.Security.DLL!Rhino.Security.Services.AuthorizationRepository.AuthorizationRepository(NHibernate.ISession session) Line 26 C#
    [External Code] 
    Microsoft.Practices.ServiceLocation.DLL!Microsoft.Practices.ServiceLocation.ServiceLocatorImplBase.GetInstance(System.Type serviceType, string key) Line 49 + 0x11 bytes    C#
    Microsoft.Practices.ServiceLocation.DLL!Microsoft.Practices.ServiceLocation.ServiceLocatorImplBase.GetInstance<Rhino.Security.Interfaces.IAuthorizationService>() Line 90 + 0x4a bytes  C#
    ClinicalTrialsAdmin.Web.Mvc.DLL!ClinicalTrialsAdmin.Web.Mvc.Controllers.Shared.SecurityHelper.IsAllowed(string operation) Line 38 + 0x24 bytes  C#
    App_Web_1yy2q1b3.dll!ASP._Page_Views_Permission_UserGridView_cshtml.Execute() Line 179 + 0xb bytes  C#
    [External Code] 
    App_Web_3rkjaiom.dll!ASP._Page_Views_Administration_Default_cshtml.Execute() Line 44 + 0x1f bytes   C#

    [External Code] 

    Session is still open!

Первый закрытый стек вызовов:

>   Rhino.Security.DLL!Rhino.Security.Services.AuthorizationRepository.AuthorizationRepository(NHibernate.ISession session) Line 26 C#
    [External Code] 
    Microsoft.Practices.ServiceLocation.DLL!Microsoft.Practices.ServiceLocation.ServiceLocatorImplBase.GetInstance(System.Type serviceType, string key) Line 49 + 0x11 bytes    C#
    Microsoft.Practices.ServiceLocation.DLL!Microsoft.Practices.ServiceLocation.ServiceLocatorImplBase.GetInstance<Rhino.Security.Interfaces.IAuthorizationService>() Line 90 + 0x4a bytes  C#
    ClinicalTrialsAdmin.Web.Mvc.DLL!ClinicalTrialsAdmin.Web.Mvc.Controllers.Shared.SecurityHelper.IsAllowed(string operation) Line 38 + 0x24 bytes  C#
    App_Web_paosedyq.dll!ASP._Page_Views_Shared__Layout_cshtml.Execute() Line 222 + 0x98 bytes  C#
    [External Code] 

    Session is now closed!

У меня все еще есть эта проблема, и я не нашел никаких новых решений.Время от времени сессия просто закрывается внутри кода Rhino Security.Таким образом, Rhino создает исключение System.ObjectDisposedException.

...