빠른 답변 / TL; DR
게으른 사람들을 위해 :
Install-Package MagicalUnicornMvcErrorToolkit -Version 1.0
그런 다음이 줄을 제거하십시오. global.asax
GlobalFilters.Filters.Add(new HandleErrorAttribute());
그리고 이것은 IIS7 + 및 IIS Express에만 해당됩니다.
Cassini를 사용하는 경우 .. 음 .. 어 .. 어색한 ...
길고 설명 된 답변
나는 이것이 대답되었다는 것을 안다. 그러나 그 대답은 정말 간단합니다 ( David Fowler 와 Damian Edwards 에게 정말로 응답 해주었습니다).
사용자 정의 작업을 수행 할 필요 가 없습니다 .
의 경우 ASP.NET MVC3
모든 비트와 조각이 있습니다.
1 단계-> 두 개의 지점에서 web.config를 업데이트하십시오.
<system.web>
<customErrors mode="On" defaultRedirect="/ServerError">
<error statusCode="404" redirect="/NotFound" />
</customErrors>
과
<system.webServer>
<httpErrors errorMode="Custom">
<remove statusCode="404" subStatusCode="-1" />
<error statusCode="404" path="/NotFound" responseMode="ExecuteURL" />
<remove statusCode="500" subStatusCode="-1" />
<error statusCode="500" path="/ServerError" responseMode="ExecuteURL" />
</httpErrors>
...
<system.webServer>
...
</system.web>
이제 사용하기로 결정한 경로를주의해서 기록하십시오. 당신은 아무것도 사용할 수 있지만 내 경로는
/NotFound
<-404를 찾을 수 없으면 오류 페이지입니다.
/ServerError
<-다른 오류의 경우 내 코드에서 발생하는 오류를 포함하십시오. 이것은 500 내부 서버 오류입니다
첫 번째 섹션에 하나의 사용자 정의 항목 <system.web>
만 있는 방법을 참조하십시오 항목? 나는 오직 하나 개의 상태 코드를 나열했습니다 때문에 포함한 다른 모든 오류 .. 다른 모든 오류가 설정에 의해 처리됩니다 (코드 버그를 가지고 있으며, 사용자의 요청을 충돌 때 발생하는 즉. 그 성가신 오류) 라고 .. , 404 페이지를 찾을 수없는 경우 경로로 이동하십시오 .statusCode="404"
500 Server Error
defaultRedirect="/ServerError"
/ServerError
확인. 그 길을 벗어났습니다 .. 지금 내 경로에 나열된global.asax
2 단계-Global.asax에서 경로 생성
여기 전체 경로 섹션이 있습니다.
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.IgnoreRoute("{*favicon}", new {favicon = @"(.*/)?favicon.ico(/.*)?"});
routes.MapRoute(
"Error - 404",
"NotFound",
new { controller = "Error", action = "NotFound" }
);
routes.MapRoute(
"Error - 500",
"ServerError",
new { controller = "Error", action = "ServerError"}
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new {controller = "Home", action = "Index", id = UrlParameter.Optional}
);
}
여기에는 두 개의 무시 경로가 표시됩니다-> axd's
및 favicons
(ooo! 보너스 무시 경로, 당신을 위해!) 그런 다음 (그리고 순서는 여기에서 중요합니다), 나는 두 개의 명시 적 오류 처리 경로가 있습니다. 이 경우 기본 설정입니다. 물론, 나는 더 많은 것을 가지고 있지만 그것은 내 웹 사이트에 특별합니다. 오류 경로가 목록의 맨 위에 있는지 확인하십시오. 순서는 필수적 입니다.
마지막으로 global.asax
파일 내부에있는 동안 HandleError 특성을 전역 적으로 등록하지 않습니다. 아뇨, 아뇨 나다. 아니. 니엔 부정. 안돼 ...
이 줄을 제거하십시오 global.asax
GlobalFilters.Filters.Add(new HandleErrorAttribute());
3 단계-조치 방법으로 제어기 작성
이제 .. 우리는 두 가지 행동 방법으로 컨트롤러를 추가합니다 ...
public class ErrorController : Controller
{
public ActionResult NotFound()
{
Response.StatusCode = (int)HttpStatusCode.NotFound;
return View();
}
public ActionResult ServerError()
{
Response.StatusCode = (int)HttpStatusCode.InternalServerError;
// Todo: Pass the exception into the view model, which you can make.
// That's an exercise, dear reader, for -you-.
// In case u want to pass it to the view, if you're admin, etc.
// if (User.IsAdmin) // <-- I just made that up :) U get the idea...
// {
// var exception = Server.GetLastError();
// // etc..
// }
return View();
}
// Shhh .. secret test method .. ooOOooOooOOOooohhhhhhhh
public ActionResult ThrowError()
{
throw new NotImplementedException("Pew ^ Pew");
}
}
좋아, 이것 좀 봐 우선, 여기 에는 속성 이 없습니다 [HandleError]
. 왜? 내장 된 ASP.NET
프레임 워크는 이미 오류를 처리 하고 있기 때문에 오류를 처리하기 위해 해야하는 모든 똥을 지정했습니다. :)이 방법에 있습니다!
다음으로 두 가지 행동 방법이 있습니다. 거기에 힘든 것은 없습니다. 예외 정보를 표시하려면 Server.GetLastError()
해당 정보를 얻는 데 사용할 수 있습니다 .
보너스 WTF : 예, 오류 처리를 테스트하기 위해 세 번째 조치 방법을 만들었습니다.
4 단계-보기 작성
마지막으로 두 개의 뷰를 만듭니다. 이 컨트롤러에 대해 정상적인 시점에 배치하십시오.
보너스 코멘트
- 당신은 필요하지 않습니다
Application_Error(object sender, EventArgs e)
- 위의 단계는 모두 Elmah 와 100 % 완벽하게 작동 합니다. 엘마 프레이크 스 약!
그리고 그것은 내 친구들입니다.
자, 이것을 많이 읽은 것을 축하하고 유니콘을 상으로 삼았습니다!