0

我有一个网站在将它放在 host-gator 上后在本地运行良好,它给出了错误http://www.akbarca.com/。Hostgator 支持团队说您的应用程序以完全信任级别运行,在这种情况下,我们只允许中等信任级别。

经过调查,我发现问题出在以完全信任级别运行的 Nhibenate 2.00 中。搜索互联网我发现解决方案是将 Nhibernate 升级到最新版本,或者安装 NHibernate.DependencyInjection,在我安装两者之后,现在我在本地计算机中收到错误:

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

到目前为止,我尝试了以下方法但没有成功:删除所有 DLL 并重新加载它们。将本地复制到所有人。

另外,当我[assembly: AllowPartiallyTrustedCallers()]遇到相同的错误时。

我想我必须让所有的 DLL 在中等信任级别下运行,如果是这样,你能告诉我如何实现它吗?

4

2 回答 2

0

当我们从 DLL 中引用一个类型时,我们遇到了同样的异常,该类型没有被复制到项目的 bin 目录中,即使它已将 copy local 设置为 true。丢失的 dll 不容易找到,因为在找到罪魁祸首之前,我们必须深入研究异常的内部异常及其堆栈跟踪。我们最初的调查指出了信任级别问题,但最终这是一条死胡同。更深入地研究内部异常(我遍历异常直到 innerException 为空)应该可以深入了解哪个 dll 加载失败。在我们的例子中,我们的项目所依赖的项目引用了“Microsoft.SqlServer.Types”,并且正在使用该 dll 中的 HierarchyId。

于 2013-05-10T14:27:57.920 回答
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);
}
于 2013-09-17T03:03:20.187 回答