Asp.net mvc NHibernate+;IIS7.5“扔”;已使用nhibernate.current“U session”密钥配置会话工厂;
使用Asp.net mvc NHibernate+;IIS7.5“扔”;已使用nhibernate.current“U session”密钥配置会话工厂;,asp.net-mvc,nhibernate,iis-7.5,s#arp-architecture,Asp.net Mvc,Nhibernate,Iis 7.5,S#arp Architecture,使用S#arp架构2.3rc,我试图发布两个网站,它们大多使用相同的代码库。我发布的第一个应用程序运行正常,但是,在部署并尝试运行第二个应用程序时,出现以下异常: Access to the path 'C:\Windows\TEMP\nhibernate.current_session--851346262.bin' is denied. A session factory has already been configured with the key of nhibernate.curr
S#arp架构2.3rc
,我试图发布两个网站,它们大多使用相同的代码库。我发布的第一个应用程序运行正常,但是,在部署并尝试运行第二个应用程序时,出现以下异常:
Access to the path 'C:\Windows\TEMP\nhibernate.current_session--851346262.bin' is denied.
A session factory has already been configured with the key of nhibernate.current_session
刷新窗口时,会出现以下异常:
Access to the path 'C:\Windows\TEMP\nhibernate.current_session--851346262.bin' is denied.
A session factory has already been configured with the key of nhibernate.current_session
我甚至尝试将它们加载到单独的应用程序池中,但错误仍然存在。我不明白为什么我的两个应用程序的会话在IIS上发生冲突,而它们在VisualStudio上运行得很好
仅供参考,我正在尝试在Windows Server 2008 R2+IIS 7.5上运行它们
有什么帮助吗?看起来S#arp体系结构试图对两个应用程序使用相同的NHibernate会话工厂。它可能会发生冲突,因为当它在磁盘上持久化配置时,它对两个web应用使用相同的默认“工厂密钥”(nhibernate.current_session)。您是否应该使用不同的“出厂密钥”?为此,您可以阅读有关多个数据库的部分(尽管您没有多个数据库,但您的解决方案可能是相同的):
问:如何添加对多个数据库的支持
A::要将对附加数据库的支持添加到项目中,请执行以下操作:
创建一个nhibernatefortherdb.config文件,其中包含
新数据库的连接字符串
在YourProject.Web.Mvc/Global.asax.cs中,位于
初始化第一个会话工厂时
对NHibernateSession.AddConfiguration()的附加调用。而
首先,NHibernate初始化假定默认工厂密钥,您将
需要为第二次初始化提供显式出厂密钥。
绑定到的存储库将引用此工厂密钥
新的数据库也
查看S#arp,我发现他们使用以下逻辑在磁盘上创建文件:
var fileName = string.Format(
"{0}-{1}.bin",
configKey,
Assembly.GetCallingAssembly().CodeBase.GetHashCode());
因此,如果您不想更改config/factory键,可以尝试从不同的程序集调用此代码
编辑:
它看起来像是NHibernateSession.Init
不接受允许您指定工厂密钥的重载。但它还有其他公共方法,您可以调用Init的:
NHibernateSession.InitStorage(storage);
try {
NHibernateSession.AddConfiguration("%PUT YOUR OWN FACTORY KEY%", ...);
} catch {
NHibernateSession.Storage = null;
throw;
}
我通过将应用程序池的标识更改为具有更多权限的标识(例如LocalSystem)来“修复”它。如果您有权访问源文件,则不是合适的修复程序。适用于使用#arch和NHibernateConfigurationFileCache的单个网站的情况。问题很可能来自
-NHibernateConfigurationFileCache使用Path.GetTempPath()来持久化配置
-网站使用网络服务或应用程序池标识下的应用程序池运行
-该标识没有对临时路径的写入权限
更好的解决方案是将代码更改为使用临时路径,其中标识将具有权限,或者
向标识的临时路径授予写入权限(例如,向IIS APPPOOL\CustomAppPool授予c:\windows\temp上的写入权限)我的问题不在于多个数据库(我只使用一个数据库)。问题是,两者都试图访问C:\Temp中相同的nhibernate_会话-{somekey},并且不能在Sharp中更改字段“DefaultFactoryKey”,这就是我认为第二段所暗示的……您的问题不是多个数据库,而是需要使用相同的解决方案。为应用设置不同的出厂密钥。可以阅读常见问题:[SessionFactory(DataGlobals.OTHER\u DB\u FACTORY\u KEY)]。请看我的最后一篇文章,我明白了。但是,如果在使用“AddConfiguration”调用自己的函数之前需要在NHibernateSession.Init()中添加什么呢?谢谢你的帮助/关心。:)谢谢你,非常非常。:)我也有同样的问题。使用了不同的应用程序池并解决了问题。请在“安全”选项卡中打开临时文件夹的属性,添加对IIS APPPOOL\yourAppPoolName的写入权限。如果找不到用户,请先尝试浏览该网站