[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 이상).
-
system.web
섹션 아래의 웹 구성에서 사용자 정의 페이지를 구성 하십시오.<customErrors mode="RemoteOnly" defaultRedirect="~/error"> <error statusCode="404" redirect="~/error/Error404" /> <error statusCode="500" redirect="~/error" /> </customErrors>
RemoteOnly
즉, 로컬 네트워크에서 실제 오류가 표시됩니다 (개발 중에 매우 유용함). 오류 코드에 대한 오류 페이지를 다시 작성할 수도 있습니다. -
매직 응답 매개 변수 및 응답 상태 코드 설정 (오류 처리 모듈 또는 오류 처리 속성)
HttpContext.Current.Response.StatusCode = 500; HttpContext.Current.Response.TrySkipIisCustomErrors = true;
-
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>
답변
이 솔루션은 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 의 전체 소스 코드를 확인하세요 .