업데이트이
답변은 해결책을 제공하기 때문에 편집하지 않을 것이지만이 문제를 해결하는 훨씬 더 깨끗한 방법을 찾았습니다. 자세한 내용은 다른 답변 을 참조하십시오 ...
원래 답변 : 메서드가 호출되지 않는
이유를 알아 냈습니다 Application_Error()
...
Global.asax.cs
public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute()); // this line is the culprit
}
...
}
기본적으로 (새 프로젝트가 생성 될 때) MVC 응용 프로그램에는 Global.asax.cs
파일에 몇 가지 논리가 있습니다. 이 논리는 경로 매핑 및 필터 등록에 사용됩니다. 기본적으로 필터 하나만 등록 HandleErrorAttribute
합니다. customErrors가 켜져 있으면 (또는 RemoteOnly로 설정된 경우 원격 요청을 통해) HandleErrorAttribute는 MVC에 오류보기를 찾도록 지시하고 Application_Error()
메서드를 호출하지 않습니다 . 이것에 대한 문서를 찾을 수는 없지만 programmers.stackexchange.com 의이 답변에 설명되어 있습니다.
처리되지 않은 모든 예외에 대해 호출되는 ApplicationError () 메서드를 가져 오려면 HandleErrorAttribute 필터를 등록하는 줄을 제거하면됩니다.
이제 문제는 다음과 같습니다. 원하는 것을 얻기 위해 customErrors를 구성하는 방법 ...
customErrors 섹션의 기본값은 redirectMode="ResponseRedirect"
. defaultRedirect 속성도 MVC 경로가되도록 지정할 수 있습니다. 매우 간단한 ErrorController를 만들고 web.config를 다음과 같이 변경했습니다.
web.config
<customErrors mode="RemoteOnly" redirectMode="ResponseRedirect" defaultRedirect="~/Error">
<error statusCode="404" redirect="~/Error/PageNotFound" />
</customErrors>
이 솔루션의 문제점은 오류 URL로 302 리디렉션을 수행 한 다음 해당 페이지가 200 상태 코드로 응답한다는 것입니다. 이로 인해 Google이 잘못된 오류 페이지의 색인을 생성합니다. 또한 HTTP 사양을 따르지 않습니다. 내가 원하는 것은 리디렉션이 아니고 사용자 지정 오류보기로 원래 응답을 덮어 쓰는 것입니다.
나는 변화를 시도했다 redirectMode="ResponseRewrite"
. 안타깝게도이 옵션은 MVC 경로를 지원하지 않으며 정적 HTML 페이지 또는 ASPX 만 지원 합니다. 처음에는 정적 HTML 페이지를 사용하려고했지만 응답 코드는 여전히 200 이었지만 최소한 리디렉션되지 않았습니다. 그런 다음 이 답변 에서 아이디어를 얻었습니다 ...
오류 처리를 위해 MVC를 포기하기로 결정했습니다. 나는 Error.aspx
및 PageNotFound.aspx
. 이 페이지는 매우 단순했지만 마법의 한 조각이 있습니다 ...
<script type="text/C#" runat="server">
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
Response.StatusCode = (int) System.Net.HttpStatusCode.InternalServerError;
}
</script>
이 블록은 페이지에 올바른 상태 코드를 제공하도록 지시합니다. 거칠게, PageNotFound.aspx 페이지에서 HttpStatusCode.NotFound
대신 사용 했습니다. web.config를 다음과 같이 변경했습니다.
<customErrors mode="RemoteOnly" redirectMode="ResponseRewrite" defaultRedirect="~/Error.aspx">
<error statusCode="404" redirect="~/PageNotFound.aspx" />
</customErrors>
모두 완벽하게 작동했습니다!
요약:
- 줄을 제거하십시오.
filters.Add(new HandleErrorAttribute());
Application_Error()
방법을 사용 하여 예외 기록
- ASPX 페이지를 가리키는 ResponseRewrite와 함께 customErrors 사용
- ASPX 페이지가 자체 응답 상태 코드를 담당하도록합니다.
이 솔루션에서 몇 가지 단점을 발견했습니다.
- ASPX 페이지는 Razor 템플릿과 어떤 마크 업도 공유 할 수 없습니다. 저는 일관된 모양과 느낌을 위해 웹 사이트의 표준 머리글 및 바닥 글 마크 업을 다시 작성해야했습니다.
- * .aspx 페이지는 URL을 눌러 직접 액세스 할 수 있습니다.
이러한 문제에 대한 해결 방법이 있지만 추가 작업을 수행 할만큼 충분히 염려하지 않았습니다.
모두에게 도움이 되었기를 바랍니다.