2017-09-08 89 views
0

我遇到了運行以.NET Framework 4.6爲目標的ASP.NET Core 1.0應用程序的問題。直到我們嘗試在運行Windows Server 2016的服務器上運行應用程序時,才發生該問題。該應用程序在IIS中託管,並且我已在服務器上安裝了.NET Core 1.0 Windows託管軟件包。ASP.NET中的ReflectionTypeLoadException核心MVC應用程序

在加載返回500錯誤的網站,這是寫入日誌:發生

未處理的異常:無法加載請求的類型中的一種或多種。檢索LoaderExceptions屬性以獲取更多信息。 (fc7986d0) System.Reflection.ReflectionTypeLoadException:無法加載一個或多個請求的類型。檢索LoaderExceptions屬性以獲取更多信息。

研究這個似乎涉及缺少DLL或不匹配的版本,我應該看LoaderExceptions屬性來獲取更多的信息,但我不知道怎麼做,在這種情況下。日誌條目只是通過在Startup.cs的Configure()方法中設置loggerFactory來創建的。

我試着添加一個IExceptionFilter ActionFilter實現並讀取LoaderExceptions屬性,如果該異常的類型爲ReflectionTypeLoadException,但它在服務器上運行時不會命中。

有沒有辦法深入到Exception來讀取LoaderExceptions屬性(在生產環境中,在Visual Studio中運行時沒有錯誤,因此調試沒有幫助),或者另一種方法來解決原始問題錯誤來確定服務器設置有什麼問題?

回答

1

我沒有使用IExceptionFilter,而是編寫了自己的Middleware來捕獲這種異常,並能夠記錄LoaderExceptions屬性中的每個異常並確定我的問題所在。下面是我添加了什麼記錄的LoaderExceptions:

public class ExceptionCatchMiddleware 
{ 
    private readonly RequestDelegate _delegate; 
    private readonly ILogger _logger; 

    public ExceptionCatchMiddleware(RequestDelegate requestDelegate, ILogger<ExceptionCatchMiddleware> logger) 
    { 
     _delegate = requestDelegate; 
     _logger = logger; 
    } 

    public async Task Invoke(HttpContext context) 
    { 
     try 
     { 
      await _delegate(context); 
     } 
     catch (ReflectionTypeLoadException e) 
     { 
      foreach (Exception ex in e.LoaderExceptions) 
      { 
       _logger.LogCritical(ex.Message + Environment.NewLine + ex.StackTrace); 
      } 
     } 
    } 
} 

然後,我只是需要中間件添加到配置()方法Startup.cs:

app.UseMiddleware<ExceptionCatchMiddleware>(); 

在我來說,這是一個缺少沒有包含在該項目中的dll,但因爲它在我的開發機器的GAC中,所以它在那裏運行得很好。