NHibernate 抛出会话已关闭

2023-12-29

我在风中拍打,所以我想我应该在这里问...请让我知道这是否是显而易见的并且之前已得到回答。

我正在构建一个 MVC 3 网站,当我与一个用户一起运行它时,我可以单击页面来运行它,该网站运行良好。然而,如果我疯狂地点击刷新,最终我会点击“会话已关闭”。

我已经隔离了几乎所有我的存储库,以尝试深入了解,所以我知道主页上有错误。存储库中唯一调用的是从数据库表中获取用户名。

我使用 Postgres 作为数据库,并使用 NauckIT 的 ASP.NET 会员提供程序。主要数据库也是Postgres(但是是另一个数据库)。

会话管理是使用以下代码完成的:

public class MvcApplication : System.Web.HttpApplication
{
    public static ISessionFactory SessionFactory = 
             NHibernateHelper.GetSessionFactory();

    public MvcApplication()
    {
        this.BeginRequest += MvcApplication_BeginRequest;
        this.EndRequest += MvcApplication_EndRequest;
    }

    void MvcApplication_BeginRequest(object sender, EventArgs e)
    {
        CurrentSessionContext.Bind(SessionFactory.OpenSession());
    }
    void MvcApplication_EndRequest(object sender, EventArgs e)
    {            
        CurrentSessionContext.Unbind(SessionFactory).Dispose();
    }
}

获取登录信息的代码是:

    public Login GetCurrentLogin()
    {
        return Session.Query<Login>().FirstOrDefault(l => l.UserID == UserAccessRepository.UserID);
    }

The UserAccessRepository只需得到userid来自表单身份验证 cookie。

使用以下命令将会话注入存储库:

        ninjectKernel.Bind<IUserRepository>().To<NHUserRepository>();
        ninjectKernel.Bind<ILeagueRepository>().To<NHLeagueRepository>().InThreadScope();
        ninjectKernel.Bind<ISession>()
            .ToMethod(m => MvcApplication.SessionFactory.GetCurrentSession())

会话工厂来自:

public class NHibernateHelper
{
    private static ISessionFactory _sessionFactory;

    public static ISessionFactory SessionFactory
    {
        get
        {
            if (_sessionFactory == null)
            {       var rawConfig = new Configuration();
                rawConfig.SetNamingStrategy(new PostgresNamingStrategy());
                var configuration = Fluently.Configure(rawConfig)
                    .Database(PostgreSQLConfiguration.Standard.ConnectionString(ConnectionString).ShowSql().Dialect("NHibernate.Dialect.PostgreSQL82Dialect"))
                    .Mappings(m =>
                                m.AutoMappings.Add(AutoMap.AssemblyOf<Event>(new AutoMapConfiguration())
                )).ExposeConfiguration(cfg => 
                    cfg.SetProperty("current_session_context_class", "web")
                _sessionFactory = configuration.BuildSessionFactory();
                Debug.WriteLine("Built SessionFactory");
            }
            return _sessionFactory;

需要明确的是,它在我单击页面的标准实例中工作正常,但是当我疯狂地按 F5 时,我遇到了会话关闭问题。

更新: 不确定它是否相关,但我在主要地方看到这个BaseController,从内部OnActionExecuting方法。通过上面的方法,似乎已经解决了。


你不应该使用InThreadScope()在网络应用程序中。使用InRequestScope()。编辑阅读对象范围 https://github.com/ninject/ninject/wiki/Object-Scopes- 它最近更新了,不知道它迟早会浪费你的时间!

如果您希望让内容在会员提供商和请求处理中工作,您需要搜索 Ninject Custom Provider(可能类似于here https://stackoverflow.com/a/10394860/11635).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NHibernate 抛出会话已关闭 的相关文章

随机推荐

  • 在 SuiteScript 中设置国家/地区

    我需要从销售订单上的自定义字段设置采购订单上的发货国家 地区 根据 NS 文档 记录浏览器 该字段是文本 但在 UI 中显然它是一个下拉菜单 在架构浏览器中 它引用国家 地区列表 其中值为 unitedStates 等 我尝试将其设置为 U
  • 如何实现CSS边框角倒角而不是圆角?

    通过CSSborder radius属性我可以在末尾有一个弯曲的圆角边框 boxLeft border right 1px dashed 333 border bottom 1px dashed 333 border radius 0 0
  • 删除 YouTube 观看稍后播放列表项目失败 - 返回 404

    我有代码可以从我的 youtube watch Later 播放列表中删除一个项目 大约两周前 这一切都正常 现在我从 YouTube 收到 404 错误 这是请求和响应的序列 当然 身份验证详细信息已被删除 获取播放列表项请求 GET 获
  • Angular 2 如何模糊按钮返回时的输入?

    如何模糊input按本机键盘返回button在移动 例如
  • XCode 4.2 版本检查器隐藏情节提要

    我不确定其他人是否遇到这个问题 但是当我单击 XCode 中的 版本编辑器 按钮时 我的 Storyboard 切换到 XML 视图 并且我不知道如何恢复可视化编辑器 有人可以帮忙吗 我真的希望这只是深夜编码困倦的结果 提前致谢 右键单击
  • AddressBook:如何获取不同 Exchange 源的名称

    我想要获取我的 iPhone 同步到的所有 Exchange 源的名称 例如如果我使用 ActiveSync Exchange 将我的设备同步到 Gmail 和 Hotmail 帐户 在本机联系人中 我可以根据我设置的不同帐户看到不同的部分
  • 是否有涵盖 iPhone、Android、WebOS 和 Blackberry OS 的 jQ Touch 等效产品?

    我即将开始使用 HTML5 CSS3 和 JavaScript 为最新的智能手机编写一个 Web 应用程序 我需要的不是框架 而是像 jQuery 这样的库 我研究了 jQTouch 它非常适合 iPhone 显然也支持 Android 但
  • JBoss JAAS 自定义登录模块

    我正在尝试使用自定义JAAS托管的基于 Web 的应用程序的身份验证模块JBoss 5 1 0 GA 所以一切似乎都工作正常 直到用户数量增加并且会话 它认为 开始变得混合 我使用自定义 JAAS 的原因是因为自定义身份验证后端以及需要传回
  • PHP 5 反射 API 性能

    我目前正在考虑在我自己的 MVC Web 框架中使用 Reflection 类 主要是 ReflectionClass 和 ReflectionMethod 因为我需要自动实例化控制器类并调用它们的方法 而无需任何所需的配置 约定优于配置
  • Telegram 机器人键盘通过 JSON 发送

    我正在使用 MS Bot 框架 我想向用户发送自定义键盘 因此我尝试使用以下 JSON 回复消息 public async Task
  • Django 查询集上的 Count() 与 len()

    在 Django 中 鉴于我有QuerySet我要迭代并打印结果 计算对象的最佳选择是什么 len qs or qs count 另外考虑到在同一迭代中计算对象也不是一种选择 虽然Django 文档 https docs djangopro
  • 如何在 Django 中实现 Northwind

    我正在尝试使用 Django admin 在 MySQL 中实现 Northwind 数据库模型来显示数据 有人知道如何从原始模型中 干净 地做到这一点吗 是否有任何功能实现可供下载 模型 管理 接下来是完全未经尝试的程序 不确定你所说的
  • 实体框架 6 Code First int Identity 列值第一行为零

    首次执行 update database 命令以使用种子数据填充数据库后 发现所有 int Id 列均以零 0 开头 而不是预期的一 1 在 Configuration cs 中的 Seed 方法顶部为每个实体 表添加了以下 2 行代码 注
  • 如何使用 VBA 将“整个”DAO 记录集插入表中

    我有一个 DAO 记录集 可以很好地创建 我可以将记录从该集传输到表中 这是逐行完成的并且效果很好 但是我一次传输大量数据 因此这可能需要很长时间一行一行 有没有一种方法可以一次性传输整个记录集 而不是逐行传输 请参阅下面的当前使用的代码
  • GitKraken 不允许我在 GitLab 上打开我的私有存储库

    所以 除了GitKraken 不允许我从 GitHub 上的私人存储库进行克隆 https stackoverflow com questions 41945280 gitkraken wont let me clone from a pr
  • 如何在osx中​​创建虚拟键盘?

    我想在 osx 中创建一个虚拟键盘 是否可以 我的意思是我可以制作一个程序来提供与真实键盘相同的信号吗 这种键盘的示例是屏幕键盘或键盘查看器 顺便说一句 它是否有必要的界面 我应该从多低开始 我应该制作一个设备驱动程序吗 虚拟 无线 键盘
  • 为什么 printf() 是一个不纯函数?

    据我所知 不纯函数是那些在使用相同参数调用时并不总是返回相同值的函数 我一定遗漏了一些东西 或者可能是错误的 如果我是的话 请纠正我 那么为什么是printf 被认为是不纯函数吗 纯 函数lacks 副作用 too 换句话说 无论你调用多少
  • 如何使用 pytest 对测试失败采取行动?

    我正在使用 pytest 我想收集 保存一些数据 以便对测试失败进行事后分析 我可以写一个teardown method 但我没有看到在这种情况下获得测试状态的方法 是否可以对任何测试采取行动 或assertion 失败 实施一个pytes
  • 从超过 max_retries 失败的任务中恢复

    我尝试异步使用 Web 服务 因为它最多需要 45 秒才能返回 不幸的是 这个 Web 服务也有些不可靠 并且可能会引发错误 我已经设置了django celery并让我的任务执行 这工作正常 直到任务失败为止max retries 这是我
  • NHibernate 抛出会话已关闭

    我在风中拍打 所以我想我应该在这里问 请让我知道这是否是显而易见的并且之前已得到回答 我正在构建一个 MVC 3 网站 当我与一个用户一起运行它时 我可以单击页面来运行它 该网站运行良好 然而 如果我疯狂地点击刷新 最终我会点击 会话已关闭