ASP.NET Core MVC应用程序中的ReflectionTypeLoadException

时间:2017-09-08 21:37:22

标签: asp.net-core asp.net-core-mvc .net-4.6

我遇到了运行面向.NET Framework 4.6的ASP.NET Core 1.0应用程序的问题。在我们尝试在运行Windows Server 2016的服务器上运行该应用程序之前,问题才出现。该应用程序托管在IIS中,我在服务器上安装了.NET Core 1.0 Windows主机软件包。

加载网站后,会返回500错误,并将其写入日志:

  

发生了未处理的异常:无法加载一个或多个请求的类型。检索LoaderExceptions属性以获取更多信息。 (fc7986d0)   System.Reflection.ReflectionTypeLoadException:无法加载一个或多个请求的类型。检索LoaderExceptions属性以获取更多信息。

研究它似乎与丢失的dll或不匹配的版本有关,我应该查看LoaderExceptions属性以获取更多信息,但我不确定如何在这个实例中执行此操作。只需在Startup.cs的Configure()方法中设置loggerFactory即可创建日志条目。

我尝试添加IExceptionFilter ActionFilter实现并在异常类型为ReflectionTypeLoadException时读取LoaderExceptions属性,但在服务器上运行时不会遇到它。

有没有办法深入了解Exception以读取LoaderExceptions属性(在生产环境中,在Visual Studio中运行时没有错误,因此调试没有帮助),或者是另一种解决原始错误的方法确定服务器设置有什么问题?

1 个答案:

答案 0 :(得分:1)

我没有使用IExceptionFilter,而是编写了自己的中间件来捕获这种异常,并且能够从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中的Configure()方法:

app.UseMiddleware<ExceptionCatchMiddleware>();

在我的情况下,这是一个缺少的dll,并没有包含在项目中,但因为它在我的开发机器的GAC中运行就好了。