> 백엔드 개발 > C#.Net 튜토리얼 > ASP.NET MVC 사용자 정의 오류 페이지

ASP.NET MVC 사용자 정의 오류 페이지

高洛峰
풀어 주다: 2016-12-24 13:48:51
원래의
1667명이 탐색했습니다.

asp.net mvc 사용자 정의 오류 페이지를 설정하는 데 문제가 있는 경우, 여러분은 혼자가 아닙니다. 귀하의 접근 방식이 정확하다는 사실에 놀랐습니다. 작동하지 않는 이유는 오류의 일부가 asp.net 파이프라인에서 처리되고 다른 부분이 iis에서 직접 처리되기 때문입니다.

일반적으로(일부 다른 프레임워크/서버에서는 그럴 것으로 예상됩니다) 오류가 발생한 위치에 상관없이 한 곳에서만 사용자 정의 오류 페이지를 구성하면 됩니다. 다음과 같습니다:

<customErrors mode="On">
  <error code="404" path="404.html" />
  <error code="500" path="500.html" />
</customErrors>
로그인 후 복사

Custom 404 오류 페이지

리소스가 존재하지 않는 경우(정적 및 동적 포함) 404 상태 페이지를 반환합니다. 일반적으로 웹 사이트 방문자에게 표시할 asp.net/iis에서 생성된 기본 오류 페이지를 대체하기 위해 약간 친숙한 정보를 제공해야 합니다. 리소스가 존재하지 않는 이유에 대한 조언을 제공하거나 옵션을 제공할 수도 있습니다. 검색할 수 있는 웹사이트.

시연을 위한 간단한 설정은 다음과 같습니다.

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8"/>
  <title>404 Page Not Found</title>
</head>
<body>
  <h1>404 Page Not Found</h1>
</body>
</html>
로그인 후 복사

다음을 포함하여 새 ASP.NET MVC 5 응용 프로그램을 만들었습니다. vs.와 함께 제공되는 표준 템플릿 이를 실행하고 존재하지 않는 경로(예: /foo/bar)로 이동하려고 하면 다음 정보가 포함된 표준 ASP.NET 404 페이지가 표시됩니다.

ASP.NET MVC自定义错误页面

아니요 너무 친절하지 않나요?

이 경우 오류는 URL과 일치하는 컨트롤러나 작업을 찾지 못하기 때문에 ASP.NET MVC에서 발생합니다.

404 오류 페이지를 사용자 정의하려면 web.config의 구성 섹션에서:

<customErrors mode="On">
 <error statusCode="404" redirect="~/404.html"/>
</customErrors>
로그인 후 복사

mode="On"이므로 로컬에서 오류 페이지를 볼 수 있습니다. 일반적으로 사용할 때만 렌더링하도록 mode="RemoteOnly"를 설정할 수 있습니다.

이제 다시 /foo/bar로 이동하면 방금 정의한 오류 페이지를 볼 수 있습니다.

하지만 예상대로 이때 URL 경로는 /foo/bar가 아닙니다. ASP.NET에서 /404.html?aspxerrorpath=/foo/bar로 리디렉션하고 응답의 HTTP 상태 코드도 일반 200인지 확인했습니다.

매우 안 좋은 일입니다. http 코드 200을 반환하는 것은 오해의 소지가 있을 뿐만 아니라 SEO에도 좋지 않습니다. 간단히 말해서, 지정된 경로에 리소스가 없으면 404를 반환해야 하며 리소스가 이동되면 새 경로로 리디렉션되어야 합니다.

이 문제를 해결하려면 오류 페이지를 리디렉션하여 응답을 다시 작성하는 ASP.NET 기본 동작을 변경하면 됩니다.

<customErrors mode="On" redirectMode="ResponseRewrite">
 <error statusCode="404" redirect="~/404.html"/>
</customErrors>
로그인 후 복사

그러나 별 효과가 없습니다(이 외국인은 정말 장황합니다). 원래 URL 주소는 리디렉션되지 않았지만 ASP.NET. 사용자 정의 오류 페이지를 일반 텍스트로 표시하는 것 외에도 여전히 반환값은 200입니다.

ASP.NET 페이지로 돌아가야 하는 것 같습니다. 이전에 *.aspx 페이지로 이동할 필요가 없다고 생각하셨다면 실망하셨을 것 같습니다.

그래서 오류 페이지와 해당 web.config를 404.aspx로 변경한 후에는 URL과 콘텐츠 형식(text/html)이 정상입니다.

그러나 200의 문제는 여전히 존재합니다. Microsoft는 공식적으로 이 문제에 대한 해당 솔루션을 제공했습니다. 즉, 404.aspx에 다음 부분을 추가합니다.

< ;% Response.StatusCode = 404 %>

이제 올바른 상태 코드, URL 및 사용자 정의 오류 페이지가 생겼습니까?

틀렸습니다.

정적 페이지 경로(예: foo.html) 또는 라우팅 구성과 일치하지 않는 URL(예: /foo/bar/foo/bar)에 링크하는 경우 표준 IIS 404 오류 페이지가 표시됩니다.

위의 상황은 ASP.NET을 우회하고 IIS가 요청을 처리합니다. 물론 컨트롤러에서 HttpNotFound()를 반환하면 동일한 결과가 나타납니다. 결과 ——MVC는 단순히 상태 코드를 설정하고 오류를 발생시키지 않고 IIS에 전달하기 때문입니다.

이 경우 iis의 오류 페이지를 설정해야 합니다(IIS에만 유효함). 7+) .web.config 구성 섹션에서:

<httpErrors errorMode="Custom">
 <remove statusCode="404"/>
 <error statusCode="404" path="/404.html" responseMode="ExecuteURL"/>
</httpErrors>
로그인 후 복사

errorMode=도 설정하세요. "Custom" 로컬 테스트의 경우 일반적으로 errorMode="DetailedLocalOnly"로 설정됩니다.

저는 aspx 대신 html 페이지를 사용했습니다. 일반적으로 ASP.NET 오류가 발생하더라도 오류 페이지가 계속 표시될 수 있도록 간단한 정적 파일을 오류 페이지로 사용해야 합니다.

이제 존재하지 않는 정적 파일 경로로 이동하면 IIS 기본 404 페이지 대신 사용자 지정 오류 페이지가 표시됩니다. 나머지는 여전히 이전과 동일한 200 문제입니다.

다행히 IIS는 실제로 이에 대한 기본 제공 솔루션을 제공합니다. responseMode="File"을 설정하면 IIS는 원래 응답 헤더를 변경하지 않고 사용자 지정 오류 페이지를 반환합니다.

완료되었습니다.

사용자 정의 500 오류 페이지

대부분은 위의 솔루션을 복사하고 사용자 정의 500 오류 페이지를 추가하는 것에 지나지 않습니다. 여기서 주목할 만한 몇 가지 사항이 있습니다.

标准的 ASP.NET MVC模板内置的 HandleErrorAttribute 作为一个全局过滤器。捕获在ASP.NET MVC管道引发的任何错误,并返回一个自定义"错误"视图提供你有在web.config中启用自定义错误。它会寻找 ~/views/{controllerName}/error.cshtml 或 ~ / views/shared/error.cshtml。

如果你使用了过滤器(filter),你需要更新现有的自定义错误视图,并不存在的则需要创建(最好放在views/shared文件夹下)

我没有看见这个filter有可以设置的属性值,在 MVC 管道引发的任何异常都会退回到标准的 ASP.NET 错误配置页面,既然你要设置那些**那这里就用不到这个filter。

添加如下自定义错误页配置:

<customErrors mode="On" redirectMode="ResponseRewrite">
 <error statusCode="404" redirect="~/404.aspx"/>
 <error statusCode="500" redirect="~/500.aspx"/>
</customErrors>
로그인 후 복사

类似于前面创建的404.aspx:

<% Response.StatusCode = 500 %>
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8" />
  <title>500 Server Error</title>
</head>
<body>
  <h1>500 Server Error</h1>
</body>
</html>
로그인 후 복사

不幸的是这样做并不会捕获到你应用程序中的每一个异常。一个相当常见的错误——由 ASP.NET 产生的请求的验证,如一个危险的url路径/foo/bar<script></script> ,这个实际上会产生一个404响应;因此你可以添加一个默认错误配置:

<customErrors mode="Off" redirectMode="ResponseRewrite" defaultRedirect="~/500.aspx">
 <error statusCode="404" redirect="~/404.aspx"/>
 <error statusCode="500" redirect="~/500.aspx"/>
</customErrors>
로그인 후 복사

最后为了捕获非ASP.NET异常我们设置IIS自定义服务器内部错误500错误页面:


总结

在你的应用程序根目录创建如下错误页面:

404.html - for IIS
404.aspx - for ASP.NET
500.html - for IIS
500.aspx - for ASP.NET

确认您设置在 ASPX 页面内的适当响应状态码.

抛弃 MVC HandleErrorAttribute 全局筛选器;配置 ASP.NET 的自定义错误:

<customErrors mode="RemoteOnly" redirectMode="ResponseRewrite" defaultRedirect="~/500.aspx">
 <error statusCode="404" redirect="~/404.aspx"/>
 <error statusCode="500" redirect="~/500.aspx"/>
</customErrors>
로그인 후 복사

配置IIS自定义错误页:

<httpErrors errorMode="DetailedLocalOnly">
 <remove statusCode="404"/>
 <error statusCode="404" path="404.html" responseMode="File"/>
 <remove statusCode="500"/>
 <error statusCode="500" path="500.html" responseMode="File"/>
</httpErrors>
로그인 후 복사

   

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持PHP中文网。


更多ASP.NET MVC自定义错误页面相关文章请关注PHP中文网!


관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿