2017-09-08 5 views
0

.NET Framework 4.6을 대상으로하는 ASP.NET Core 1.0 응용 프로그램을 실행하는 중 문제가 발생합니다. 문제는 Windows Server 2016을 실행하는 서버에서 응용 프로그램을 실행하려고 시도 할 때까지 발생하지 않았습니다. 응용 프로그램은 IIS에서 호스팅되며 .NET Core 1.0 Windows 호스팅 번들이 서버에 설치되어 있습니다.ASP.NET Core MVC 응용 프로그램의 ReflectionTypeLoadException

500 오류가 반환되는 사이트를로드시

이이 로그에 기록됩니다

처리되지 않은 예외가 발생했습니다 : 요청 된 유형 중 하나 이상을로드 할 수 없습니다. 자세한 내용은 LoaderExceptions 속성을 검색하십시오. (fc7986d0) System.Reflection.ReflectionTypeLoadException : 요청한 형식 중 하나 이상을로드 할 수 없습니다. 자세한 내용은 LoaderExceptions 속성을 검색하십시오. 이 누락 된 DLL 또는 일치하지 않는 버전으로 관련이 보인다, 내가 더 많은 정보를 얻을 수있는은 LoaderExceptions 속성에 보일 것입니다,하지만이 경우에 그 작업을 수행하는 방법을 모르겠어요 그이를 검토 한 결과

. 로그 항목은 Startup.cs의 Configure() 메소드에서 loggerFactory를 설정하는 것만으로 작성됩니다.

예외가 ReflectionTypeLoadException 유형 인 경우 IExceptionFilter ActionFilter 구현을 추가하고 LoaderExceptions 속성을 읽으려고 시도했지만 서버에서 실행될 때 히트하지 않습니다.

LoaderExceptions 속성을 읽도록 Exception을 드릴 다운하는 방법이 있습니까 (프로덕션 환경에서는 Visual Studio에서 실행할 때 오류가 없어서 디버깅이 도움이되지 않았습니다) 또는 다른 방법으로 원본 문제를 해결하십시오 오류로 인해 서버 설정에 어떤 문제가 있는지 확인하십시오.

답변

1

대신 IExceptionFilter를 사용하여이 종류의 예외를 잡기위한 자체 미들웨어를 작성하고 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>(); 

를 내 경우에는 그것이이었다 저는 여기은 LoaderExceptions를 로그에 추가 것입니다 프로젝트에 포함되지 않은 dll이 누락되었지만 내 dev 컴퓨터의 GAC에 있었기 때문에 정상적으로 실행되었습니다.

관련 문제