让 NHibernate 以中等信任度处理共享主机

Posted

技术标签:

【中文标题】让 NHibernate 以中等信任度处理共享主机【英文标题】:Get NHibernate working on shared hosting with medium trust 【发布时间】:2012-05-12 05:36:47 【问题描述】:

一位朋友在他的计算机上使用 NHibernate 在本地创建了一个 ASP.NET 网站,并在我从 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 告诉关闭反射优化器。我找不到怎么做,但我怀疑你根本无法在 VS2010 的 ASP.NET 网站 中做到这一点。 SO 上的其他人建议先将其转换为 ASP.NET Web 应用程序,这样您可以更好地控制程序集引用。

问题是网站的截止日期(这是一个学校项目)已经是下周五了。我们还没有学习任何类型的 ORM,但我们希望它可以为我们节省大量时间。我想提出 3 个问题:

    鉴于例外情况以及它是具有中等信任度的共享主机这一事实,我们能否让 NHibernate 在相当长的时间内正常工作?

    我们如何将我们的网站转换为网络应用程序?

    我们还需要采取哪些进一步的步骤?

我知道实际上不允许一次问多个问题,但这些问题非常相关,我觉得所有问题都有一个答案。

感谢任何帮助。如果您需要完整的堆栈跟踪,我会发布它。

【问题讨论】:

【参考方案1】:

见blog post 和this one。我需要在使用中等信任的 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 一起使用。

【讨论】:

当我的朋友有时间处理它时,我会告诉你结果。他昨天一整天都在努力让它发挥作用,但我一点也不懂,因为我没有经验。他知道一点 Java hibernate,所以他有背景知识。 好吧,他说他试过了,但无济于事……还是谢谢你的帮助。 他在使用 Linq 吗?如果是这样,仍然安装依赖注入模块并尝试使用session.QueryOver 另一个想法是看看您的托管服务提供商是否可以提供他们的中等信任文件供您测试。然后你可以进入你的解决方案 我们已经在本地测试了中等信任度,只需在 Web 配置中进行设置。然后它甚至不起作用。非常感谢您愿意提供帮助,但恐怕我们将不得不放弃 NHibernate 并手动完成所有工作......这只是一个小项目。

以上是关于让 NHibernate 以中等信任度处理共享主机的主要内容,如果未能解决你的问题,请参考以下文章

NHibernate 2.1.2 中等信任度

NHibernate 3.3.1 与中等信任错误

在共享主机上使用 Castle Windsor 和 NHibernate 设施

以中等信任度在 ASP.NET 中存储临时用户文件

哪个 IOC 容器以中等信任运行

如何以中等信任从 ASP.NET 中的 bin 文件夹加载文件