为什么不能有多个用户访问我的网站

本文关键字:访问 我的 网站 用户 不能 为什么 | 更新日期: 2023-09-27 18:33:11

我正在尝试使用C# MVC nHibernate构建一个网站。一切正常,但是当我在多个浏览器中浏览我的网站时,我收到错误:

已经有一个与此连接关联的打开的 DataReader,必须先关闭该读取器。

我已将我的许多服务绑定到一个会话(ISession)。

        //ContentService Bingings
        Bind<IContentService>().To<ContentService>().InRequestScope();
        Bind<ISession>()
            .ToMethod(
                context =>
                    context.Kernel.Get<IMasterSessionSource>()
                        .ExposeConfiguration()
                        .BuildSessionFactory()
                        .OpenSession()
            )
            .WhenInjectedInto<IContentService>()
            .InSingletonScope();
        //GeneralService Bindings
        Bind<ISession>()
            .ToMethod(
                context =>
                    context.Kernel.Get<IMasterSessionSource>()
                        .ExposeConfiguration()
                        .BuildSessionFactory()
                        .OpenSession())
            .WhenInjectedInto<IGeneralService>()
            .InSingletonScope();
        Bind<IGeneralService>()
            .To<GeneralService>()
            .InSingletonScope();
        //CrossSellService Bindings
        Bind<ISession>()
            .ToMethod(
                context =>
                    context.Kernel.Get<IMasterSessionSource>()
                        .ExposeConfiguration()
                        .BuildSessionFactory()
                        .OpenSession())
            .WhenInjectedInto<ICrossSellService>()
            .InSingletonScope();
        Bind<ICrossSellService>()
            .To<CrossSellService>()
            .InSingletonScope();

        //Details Bindings
        Bind<ISession>()
                       .ToMethod(
                           context =>
                               context.Kernel.Get<IMasterSessionSource>()
                                   .ExposeConfiguration()
                                   .BuildSessionFactory()
                                   .OpenSession())
                       .WhenInjectedInto<IDetailsService>()
                       .InRequestScope();
        Bind<IDetailsService>()
            .To<DetailsService>()
            .InRequestScope();

他们被要求用于其他用途。 例如我的详细信息服务:

公共接口 IDetailsService { 在此处覆盖;
}

public class DetailsService : IDetailsService
{
    private static IContentService Context { get; set; }
    public DetailsService(IContentService context)
    {
        Context = context;
    }
 ...

其中 IContentService 是我的主要查询类:

 public interface IContentService
 {
    IQueryable<Source> Sources { get; }
  }
public class ContentService : IContentService
{
    private readonly ISession _session;
    public ContentService(ISession session)
    {
        _session = session;
    }
   public IQueryable<Source> Sources
    {
        get { return _session.Query<Source>(); }
    }

不知道为什么它不访问多个查询

为什么不能有多个用户访问我的网站

看起来发生这种情况

的原因是因为您尝试在不同的线程中使用相同的 ISession。 它这样做的原因是因为:

Bind<ISession>()
        ...
        .InSingletonScope();

您的会话不应是 Web 环境中的单一实例。 我建议使用nhibernate上下文会话。

为什么 Nhibernate 在我的 MVC 应用程序中的多个请求之间共享会话?

听起来很随机,但我的一位同事在我们支持的应用程序中遇到了类似的问题。他说这个问题与使用单例有关。它已通过更改为瞬态来修复。