문제

누군가가 ASP.NET MVC에서 유효한 조치 또는 컨트롤러를 호출하지 않는 URL에 유효한 조치 또는 컨트롤러를 호출하지 않는 URL을 입력 할 때 사용자 정의 HTTP 404 오류 페이지를 만들려고합니다.

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

유효하지 않은 URL을 잡기 위해 할 수있는 라우팅 마법이 있습니까?

업데이트: 주어진 답변을 시도했지만 여전히 못생긴 "자원이 찾지 못했습니다"메시지를받습니다.

다른 업데이트 : 좋아, 분명히 RC1에서 뭔가 바뀌었다. 나는 심지어 404를 구체적으로 트래핑하려고 시도했다 HttpException 그리고 여전히 "찾을 수없는 리소스"페이지를 제공합니다.

MVCContrib의 리소스 기능을 사용했으며 같은 문제도 사용하지 않았습니다. 어떤 아이디어?

도움이 되었습니까?

해결책

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

보다: ASP.NET MVC 용 쿼리를 찾을 수있는 '404 페이지를 찾을 수있는 모든 경로를 잡을 수있는 방법은 무엇입니까?

다른 팁

프로덕션 서버에서 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라는 뷰가 렌더링됩니다.

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

NotFoundMVC는 웹 애플리케이션 시작 중에 자동으로 설치됩니다. 404 httpexception이 일반적으로 ASP.NET MVC에 의해 던져지는 모든 방법을 처리합니다. 여기에는 누락 된 컨트롤러, 작업 및 경로가 포함됩니다.

단계별 설치 안내서 :

1- 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 NUGET 패키지 관리를 선택하십시오 ...

2- 검색 NotFoundMvc 그리고 그것을 설치하십시오.enter image description here

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

enter image description here

4- 새로 추가 된 notfound.cshtml을 뷰/공유로 열고 당신의 의지에 따라 수정하십시오. 이제 응용 프로그램을 실행하고 잘못된 URL을 입력하면 사용자 친화적 인 404 페이지로 인사합니다.

enter image description here

더 이상 사용자는 오류 메시지와 같은 오류 메시지가 표시되지 않습니다 Server Error in '/' Application. The resource cannot be found.

도움이 되었기를 바랍니다 :)

추신 : kudos to 앤드류 데이비 그런 멋진 플러그인을 만들었습니다.

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

<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>

그런 다음 다음과 같이 글로벌 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에서 일한다면 이것 해결책, 그것은 나를 위해 일했습니다.

다음 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.

같은 문제가 있었는데, 당신이해야 할 일은 views 폴더의 web.config 파일에 customerrors 속성을 추가하는 대신 프로젝트 루트 폴더의 web.config 파일에 추가해야합니다.

다음은 단일 장소에서 오류 페이지를 완전히 사용자 정의 할 수있는 진정한 답변입니다. Web.config를 수정하거나 별도의 코드를 만들 필요가 없습니다.

MVC 5에서도 작동합니다.

컨트롤러 에이 코드를 추가하십시오.

        if (bad) {
            Response.Clear();
            Response.TrySkipIisCustomErrors = true;
            Response.Write(product + I(" Toodet pole"));
            Response.StatusCode = (int)HttpStatusCode.NotFound;
            //Response.ContentType = "text/html; charset=utf-8";
            Response.End();
            return null;
        }

기반 http://www.eidias.com/blog/2014/7/2/mvc-custom-error-pages

특정 사례에 대해 이야기하겠습니다.

아래와 같이 HomeController에서 'pagenotfound 메소드'를 사용하는 경우

[Route("~/404")]
public ActionResult PageNotFound()
{
  return MyView();
}

이 일이 작동하지 않을 것입니다. 그러나 아래와 같은 경로 태그를 지우십시오.

//[Route("~/404")]
public ActionResult PageNotFound()
{
  return MyView();
}

그리고 web.config에서 메소드 이름으로 변경하면 효과가있다. 그러나 web.config에서 아래와 같이 코드를하는 것을 잊지 마십시오.

<customErrors mode="On">
  <error statusCode="404" redirect="~/PageNotFound" /> 
 *// it is not "~/404" because it is not accepted url in Route Tag like [Route("404")]*
</customErrors>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top