Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc NHibernate+;IIS7.5“扔”;已使用nhibernate.current“U session”密钥配置会话工厂;_Asp.net Mvc_Nhibernate_Iis 7.5_S#arp Architecture - Fatal编程技术网

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的写入权限。如果找不到用户,请先尝试浏览该网站