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