ASP.NET中的ReflectionTypeLoadException核心MVC应用程序

问题描述:

我遇到了运行以.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中运行时没有错误,因此调试没有帮助),或者另一种方法来解决原始问题错误来确定服务器设置有什么问题?

我没有使用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中,所以它在那里运行得很好。