2013-04-28 38 views
0

我有一个网站工作后,把它放在主机 - 鳄鱼它正在给出错误http://www.akbarca.com/罚款。 Hostgator支持团队说,你的应用程序运行在完全信任级别,在这种情况下,我们只允许中等信任级别。更新NHibernate后,我得到LoaderExceptions错误?

经过调查,我发现问题是在Nhibenate 2.00运行在完全信任级别。搜索网上我找到了解决方法是NHibernate的升级到最新的或可替代已安装NHibernate.DependencyInjection后,我安装了,现在我得到的错误在我的本地计算机:

无法加载一个或多个请求的类型。检索 LoaderExceptions属性以获取更多信息。

到目前为止,我已经尝试过没有成功的例子: 删除所有的DLL并reimpoterd他们。 将本地复制为全部。

此外,当我有[assembly: AllowPartiallyTrustedCallers()]我得到相同的错误。

我想我必须让所有的DLL都运行在中等信任级别,如果可以,请告诉我如何实现它们?

回答

0

当我们从一个DLL中引用一个类型时,我们遇到了同样的异常,即使它已经将本地副本设置为true,但仍未被复制到项目的bin目录中。缺少的DLL不容易找到,因为我们必须在找到罪魁祸首之前深入查看异常的内部异常和堆栈跟踪。我们最初的调查指出了信任等级问题,但最终它是一个死胡同。深入研究内部异常(我绕过异常,直到innerException为null)应该提供有关哪个dll无法加载的信息。在我们的例子中,它是由我们的项目所依赖的项目引用的“Microsoft.SqlServer.Types”,并且使用该dll中的HierarchyId。

+0

我已经手动添加和移除了Dll的数千倍,并且通过设置本地复制true仍然没有运气。 – 2013-05-11 19:16:15

0

我碰到的这几次,它的通常缺少的依赖,并总是超级沮丧。

在Fluent初始化期间抛出异常的事实有时会使异常有点误导,因为它根本不是FNH异常。 ReflectionTypeLoadException也将异常保存为LoaderExceptions属性中的数组,这一事实也使得挖掘更多的工作。

注意确保您的个别项目中的引用是一致的。例如,当我让R#为我已经在另一个项目中使用Nuget映射的项目添加依赖项时,我遇到了这个问题。第二个项目得到了一个本地很好的参考,但在服务器上是无效的(并且没有使用Nuget解决),使得在本地重现更加困难。

无论如何,这里有一个代码片段可以帮助你追踪罪魁祸首。本示例来自使用Global.asax的MVC应用程序,但可以轻松地适用于其他项目类型。

protected void Application_Error(object sender, EventArgs e) 
{ 
    Exception ex = Server.GetLastError(); 
    if (null == ex || ex is ThreadAbortException) 
    { 
     // could be due to redirect 
     return; 
    } 
    if (ex is HttpException && ((HttpException)ex).GetHttpCode() == 404) 
    { 
     // don't want to log this 
     return; 
    } 

    LogException(ex); 
} 

private void LogException(Exception exception) 
{ 
    if (exception is ReflectionTypeLoadException) 
    { 
     foreach (Exception loaderException in ((ReflectionTypeLoadException)exception).LoaderExceptions) 
     { 
      LogException(loaderException); 
     } 
     if (null != exception.InnerException) 
     { 
      LogException(exception); 
     } 
    } 
    else if (null != exception.InnerException) 
    { 
     LogException(exception.InnerException); 
    } 

    // you might also choose System.Console.WriteLine(...), System.Diagnostics.Trace.WriteLine(...), etc. 
    System.Diagnostics.Debug.WriteLine(exception.Message); 

    // or send to your favorite logger...this is log4net 
    Log.FatalFormat("Unhandled error in the website: {0}", exception); 
}