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