[asp.net] 사용자 지정 ASP.NET MVC 404 오류 페이지에 대한 라우팅

일반 “Resource Not Found”ASP.NET 오류를 표시하는 대신 ASP.NET MVC에서 유효한 동작이나 컨트롤러를 호출하지 않는 URL을 입력 할 때 사용자 지정 HTTP 404 오류 페이지를 만들려고합니다.

나는 이것을 처리하기 위해 web.config를 사용하고 싶지 않습니다.

잘못된 URL을 포착하기 위해 할 수있는 라우팅 마법이 있습니까?

업데이트 : 주어진 대답을 시도했지만 여전히 추악한 “Resource Not Found”메시지가 나타납니다.

또 다른 업데이트 : RC1에서 뭔가 변경된 것 같습니다 . 나는 특별히 404 트랩을 시도했지만 HttpException여전히 “Resource Not Found”페이지 만 표시됩니다.

MvcContrib의 리소스 기능도 사용했지만 동일한 문제가 없습니다. 어떤 아이디어?



답변

경로 테이블 끝에 모든 경로를 추가하고 원하는 페이지를 표시하십시오.

참조 : ASP.NET MVC에 대한 ‘404 페이지를 찾을 수 없음’쿼리를 처리하기 위해 모든 경로를 catch하려면 어떻게해야합니까?


답변

3 시간 동안 프로덕션 서버에서 사용자 지정 오류를 활성화하려고 시도했지만 경로없이 ASP.NET MVC에서이를 수행하는 방법에 대한 최종 솔루션을 찾은 것 같습니다.

ASP.NET MVC 응용 프로그램에서 사용자 지정 오류를 사용하려면 다음이 필요합니다 (IIS 7 이상).

  1. system.web섹션 아래의 웹 구성에서 사용자 정의 페이지를 구성 하십시오.

    <customErrors mode="RemoteOnly"  defaultRedirect="~/error">
        <error statusCode="404" redirect="~/error/Error404" />
        <error statusCode="500" redirect="~/error" />
    </customErrors>

    RemoteOnly즉, 로컬 네트워크에서 실제 오류가 표시됩니다 (개발 중에 매우 유용함). 오류 코드에 대한 오류 페이지를 다시 작성할 수도 있습니다.

  2. 매직 응답 매개 변수 및 응답 상태 코드 설정 (오류 처리 모듈 또는 오류 처리 속성)

      HttpContext.Current.Response.StatusCode = 500;
      HttpContext.Current.Response.TrySkipIisCustomErrors = true;
  3. system.webServer섹션 아래의 웹 구성에서 다른 매직 설정을 설정 하십시오.

    <httpErrors errorMode="Detailed" />

이것은 내가 찾은 마지막 것이었고 그 후에 프로덕션 서버에서 사용자 정의 오류를 볼 수 있습니다.


답변

이 기사의 뷰를 반환하는 ErrorController를 만들어 오류 처리가 작동하도록했습니다. 또한 global.asax의 경로에 “Catch All”을 추가해야했습니다.

Web.config에없는 경우 이러한 오류 페이지가 어떻게 표시되는지 볼 수 없습니다 ..? 내 Web.config는 다음을 지정해야했습니다.

customErrors mode="On" defaultRedirect="~/Error/Unknown"

그리고 다음을 추가했습니다.

error statusCode="404" redirect="~/Error/NotFound"


답변

출처

NotFoundMVC 컨트롤러, 작업 또는 경로가 ASP.NET MVC3 응용 프로그램에서 발견되지 않을 때마다 사용자 친화적 인 404 페이지를 제공합니다. 기본 ASP.NET 오류 페이지 대신 NotFound라는 뷰가 렌더링됩니다.

다음을 사용하여 nuget을 통해이 플러그인을 추가 할 수 있습니다. Install-Package NotFoundMvc

NotFoundMvc는 웹 응용 프로그램을 시작하는 동안 자동으로 설치됩니다. 일반적으로 ASP.NET MVC에서 404 HttpException이 발생하는 모든 다른 방식을 처리합니다. 여기에는 누락 된 컨트롤러, 작업 및 경로가 포함됩니다.

단계별 설치 가이드 :

1-프로젝트를 마우스 오른쪽 버튼으로 클릭하고 Nuget 패키지 관리 …를 선택합니다.

2-검색하여 NotFoundMvc설치합니다.
여기에 이미지 설명 입력

3-설치가 완료되면 두 개의 파일이 프로젝트에 추가됩니다. 아래 스크린 샷과 같습니다.

여기에 이미지 설명 입력

4-Views / Shared에 새로 추가 된 NotFound.cshtml을 열고 원하는대로 수정합니다. 이제 응용 프로그램을 실행하고 잘못된 URL을 입력하면 사용자 친화적 인 404 페이지가 표시됩니다.

여기에 이미지 설명 입력

더 이상 사용자는 다음과 같은 오류 메시지를 받게됩니다. Server Error in '/' Application. The resource cannot be found.

도움이 되었기를 바랍니다 🙂

추신 : 멋진 플러그인을 만든 Andrew Davey 에게 찬사를 보냅니다 .


답변

web.config에서 이것을 시도하여 IIS 오류 페이지를 교체하십시오. 이것은 내가 생각하는 최고의 솔루션이며 올바른 상태 코드도 보냅니다.

<system.webServer>
  <httpErrors errorMode="Custom" existingResponse="Replace">
    <remove statusCode="404" subStatusCode="-1" />
    <remove statusCode="500" subStatusCode="-1" />
    <error statusCode="404" path="Error404.html" responseMode="File" />
    <error statusCode="500" path="Error.html" responseMode="File" />
  </httpErrors>
</system.webServer>

Tipila의 추가 정보 -사용자 지정 오류 페이지 사용 ASP.NET MVC


답변

이 솔루션은 web.config 파일 변경이나 포괄 경로가 필요하지 않습니다.

먼저 다음과 같은 컨트롤러를 만듭니다.

public class ErrorController : Controller
{
    public ActionResult Index()
    {
        ViewBag.Title = "Regular Error";
        return View();
    }

    public ActionResult NotFound404()
    {
        ViewBag.Title = "Error 404 - File not Found";
        return View("Index");
    }
}

그런 다음 “Views / Error / Index.cshtml”아래에보기를 다음과 같이 만듭니다.

 @{
      Layout = "~/Views/Shared/_Layout.cshtml";
  }
  <p>We're sorry, page you're looking for is, sadly, not here.</p>

그런 다음 아래와 같이 Global asax 파일에 다음을 추가하십시오.

protected void Application_Error(object sender, EventArgs e)
{
        // Do whatever you want to do with the error

        //Show the custom error page...
        Server.ClearError();
        var routeData = new RouteData();
        routeData.Values["controller"] = "Error";

        if ((Context.Server.GetLastError() is HttpException) && ((Context.Server.GetLastError() as HttpException).GetHttpCode() != 404))
        {
            routeData.Values["action"] = "Index";
        }
        else
        {
            // Handle 404 error and response code
            Response.StatusCode = 404;
            routeData.Values["action"] = "NotFound404";
        }
        Response.TrySkipIisCustomErrors = true; // If you are using IIS7, have this line
        IController errorsController = new ErrorController();
        HttpContextWrapper wrapper = new HttpContextWrapper(Context);
        var rc = new System.Web.Routing.RequestContext(wrapper, routeData);
        errorsController.Execute(rc);

        Response.End();
}

이 작업을 수행 한 후에도 사용자 지정 IIS 오류 페이지가 계속 표시되는 경우 웹 구성 파일에서 다음 섹션이 주석 처리되었는지 (또는 비어 있는지) 확인하십시오.

<system.web>
   <customErrors mode="Off" />
</system.web>
<system.webServer>
   <httpErrors>
   </httpErrors>
</system.webServer>


답변

MVC 4에서 작업하는 경우이 솔루션을 시청할 수 있습니다 .

my에 다음 Application_Error 메서드를 추가합니다 Global.asax.

protected void Application_Error(object sender, EventArgs e)
{
    Exception exception = Server.GetLastError();
    Server.ClearError();

    RouteData routeData = new RouteData();
    routeData.Values.Add("controller", "Error");
    routeData.Values.Add("action", "Index");
    routeData.Values.Add("exception", exception);

    if (exception.GetType() == typeof(HttpException))
    {
        routeData.Values.Add("statusCode", ((HttpException)exception).GetHttpCode());
    }
    else
    {
        routeData.Values.Add("statusCode", 500);
    }

    IController controller = new ErrorController();
    controller.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
    Response.End();

컨트롤러 자체는 정말 간단합니다.

public class ErrorController : Controller
{
    public ActionResult Index(int statusCode, Exception exception)
    {
        Response.StatusCode = statusCode;
        return View();
    }
}

GitHub에서 Mvc4CustomErrorPage 의 전체 소스 코드를 확인하세요 .