【发布时间】:2014-01-19 20:35:04
【问题描述】:
我有一个结合 Castle Windsor IoC + Nhibernate 的 MVC5 项目,
现在那里没有那么多,但是当我在 Global.asax 中调试 Application_Start 函数时,我可以看到每个请求都会命中它,
有时每隔几次就一个请求...
我了解到,如果 IIS 文件夹中的文件发生更改,可能会发生重新编译 - 但我使用的是 IIS Express - 并且不知道该文件夹在哪里。
我们曾经有一个 .mdf + LocalDb 用于我们的测试环境,所以我认为这可能是问题所在,所以我现在连接到 SqlExpress,并从解决方案中删除了 .mdf,
但还是同样的问题...
什么可能导致这种行为?以及如何进一步调查它发生的原因?
*我检查过 - 似乎即使重定向到不同的操作它也会重新加载 MVC - 登录后 Application_Start 发生 3 次......
编辑 1:
开始将所有内容添加到新项目以查找导致问题的原因,当我添加自定义 NHibernate UserStore 以用于新的 MVC5 身份时,问题出现了
public class NhUserStore : IUserStore<User>, IUserPasswordStore<User>
{
public ISession _session;
public NhUserStore(ISession session)
{
_session = session;
}
public Task CreateAsync(User user)
{
return Task.FromResult(_session.Save(user));
}
...
}
我认为这与 Session 在 Windsor 中配置为 LifeStyle.PerWebRequest 和 NhUserStore 取决于 Session 的事实有关,但我不知道为什么
这些是我们的温莎安装程序:
public class ControllersInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(Classes.FromThisAssembly()
.BasedOn<Controller>()
.LifestyleTransient());
container.Register(Classes.FromThisAssembly()
.BasedOn<ApiController>()
.LifestyleScoped());
}
}
我注意到在 MVC5 的模板中有:
public AccountController()
: this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())))
{
}
所以我像这样使用 NH 的会话:
public AccountController(ISession session)
: this(new UserManager<User>(new NhUserStore(session)))
{
}
public AccountController(UserManager<User> userManager)
{
UserManager = userManager;
}
我现在将 UserManager 的创建更改为此并修复了一半,现在 MVC 仅在使用 UserStore 时重新启动,而不是每个请求,在使用 UserStore 的功能时仍然多次
【问题讨论】:
-
你不能在一个空白的新 mvc5 站点上重现这个问题吗?
-
正在尝试,到目前为止配置了windsor,仍然没有问题,现在将配置Nhibernate
-
当我添加一个自定义的 Nhibernate UserStore 时发生,嗯
-
尝试隔离问题并发布最小的罪魁祸首。
-
添加了更多代码和罪魁祸首
标签: c# asp.net asp.net-mvc castle-windsor asp.net-mvc-5