一位朋友在我的计算机本地使用了NHibernate,在我从SVN存储库下载后,在我的计算机上工作。但是,我们正尝试在具有中等信任级别的共享托管环境中托管它。服务器提供以下异常(部分堆栈跟踪):
[SecurityException: Request for the permission of type 'System.Security.Permissions.ReflectionPermission, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.]
System.Security.CodeAccessSecurityEngine.Check(Object demand, StackCrawlMark& stackMark, Boolean isPermSet) +0
System.Security.CodeAccessSecurityEngine.Check(CodeAccessPermission cap, StackCrawlMark& stackMark) +31
System.Security.CodeAccessPermission.Demand() +46
System.Reflection.Emit.DynamicMethod.PerformSecurityCheck(Type owner, StackCrawlMark& stackMark, Boolean skipVisibility) +166
System.Reflection.Emit.DynamicMethod..ctor(String name, Type returnType, Type[] parameterTypes, Type owner, Boolean skipVisibility) +40
NHibernate.Bytecode.Lightweight.ReflectionOptimizer.CreateDynamicMethod(Type returnType, Type[] argumentTypes) in ReflectionOptimizer.cs:104
与反思有关。在NHforge.org上有一个guide,告诉他关闭Reflection Optimiser。我找不到怎么做,但我怀疑你根本无法在VS2010的 ASP.NET网站中完成任务。 SO上的其他人建议首先将其转换为 ASP.NET Web应用程序,在那里您可以更好地控制程序集引用。
问题是该网站的截止日期(这是一个学校项目)已经是下周五了。我们还没有学过任何类型的ORM,但我们希望它能为我们节省大量时间。我想提出三个问题:
鉴于这是一个例外以及它是一个具有中等信任度的共享主机,我们是否可能让NHibernate在相当长的时间内工作?
我们如何将网站转换为网络应用程序?
我们需要采取哪些进一步措施?
我知道一次不能提出多个问题,但这些问题非常相关,我觉得所有问题都有一个答案。
感谢任何帮助。如果你需要完整的堆栈跟踪,我会发布它。
答案 0 :(得分:1)
请参阅此blog post以及this one。我需要在使用Medium Trust的Rackspace云上使用NH3.2。您需要做的就是运行此Nuget命令,它应该下载正确的程序集(您可能需要首先删除现有的NH dll)。
PM> Install-Package NHibernate.DependencyInjection
可以找到here的nuget包装。
然后将此代码放入您的应用中: -
protected void Application_Start() {
Initializer.RegisterBytecodeProvider();
...
Rest of configuration code here
}
看起来Randy已将此更新为与NH3.3一起使用。