2013-04-28 69 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); 
}