2016-07-07 4 views
4

나는 사용자 정의 오류 페이지를 작동시키고 단순히 정적 페이지를 사용하여 자신의 길을 찾기 위해 싸우고 있습니다. 고정 페이지가 작동하더라도 현재로서는 탐색 바를 다시 작성해야합니다. 현재 다음을 사용하여 사용자 정의 오류 페이지를 지정하고 있습니다.레이아웃이있는 사용자 정의 오류 페이지

<httpErrors errorMode="Custom"> 
    <remove statusCode="404"/> 
    <error statusCode="404" path="/404.html" responseMode="File"/> 
</httpErrors> 

모두 오류 및 Asp.net 오류를 IIS에 대해 처리 할 수있는 동적 사용자 지정 오류 페이지를 구현하는 방법이 있습니까 처리

<customErrors mode="On" redirectMode="ResponseRewrite"> 
    <error statusCode="404" redirect="~/404.aspx"/> 
</customErrors> 

IIS 오류 처리

Asp.net 오류?

+0

내 제안을보고 시나리오에 적용 할 수 있는지 확인하십시오. – Nkosi

답변

1

저는 ASP.Net MVC 프로젝트에서 동일한 문제를 다루기 위해 처리기를 통해 .Net을 통해 모든 것을 파이핑했습니다. ErrorController 먼저

<system.webServer> 
    <handlers> 
     <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" /> 
     <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" /> 
     <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> 
     <remove name="OPTIONSVerbHandler" /> 
     <remove name="TRACEVerbHandler" /> 
     <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*.*" verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" /> 
     <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*.*" verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" /> 
     <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*.*" verb="GET,HEAD,POST,DEBUG,PUT,DELETE" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> 
    </handlers> 
    </system.webServer> 

는 요청 오류를 처리하기 위해 만든 찾을 수없는 요청은 좋아했다.

[AllowAnonymous] 
public class ErrorController : Controller { 
    // GET: Error 
    public ActionResult NotFound() { 
     Response.StatusCode = (int)System.Net.HttpStatusCode.NotFound; 
     Response.TrySkipIisCustomErrors = true; 
     HttpContext.Response.StatusCode = (int)System.Net.HttpStatusCode.NotFound; 
     HttpContext.Response.TrySkipIisCustomErrors = true; 
     return View(); 
    } 

    public ActionResult Error() { 
     Response.StatusCode = (int)System.Net.HttpStatusCode.InternalServerError; 
     Response.TrySkipIisCustomErrors = true; 
     return View(); 
    } 
} 

당신은 내가 IIS 오류

그리고 기본 컨트롤러가 ErrorController.NotFound 작업이 생성에 매핑하는 모든 알 수없는 작업을 처리 할 수 ​​

을 피하려고 TrySkipIisCustomErrors 전화를 알 수 있습니다.

public abstract class FrontOfficeControllerBase : Controller { 
    protected override void HandleUnknownAction(string actionName) { 
     var data = ViewData; 
     //Custom code to resolve the view. 
     //ViewResult view = this.View<ErrorController>(c => c.NotFound()); 

     //Manually create view with view Data 
     ViewResult view = new ViewResult(); 
     view.ViewData = new ViewDataDictionary(); 
     view.ViewData["controller"] = "Error"; 
     view.ViewData["action"] = "NotFound"; 

     if (data != null && data.Count > 0) { 
      data.ToList().ForEach(view.ViewData.Add); 
     } 

     Response.StatusCode = (int)System.Net.HttpStatusCode.NotFound; 
     Response.TrySkipIisCustomErrors = true; 
     view.ExecuteResult(this.ControllerContext); 
    } 
} 

모두 Controllers은이 기본 컨트롤러를 상속합니다.

캐치 모든 경로는 다른 모든 경로 뒤에 구성되었습니다.

routes.MapRoute(
    name: "404-NotFound", 
    url: "NotFound", 
    defaults: new { controller = "Error", action = "NotFound" } 
); 

routes.MapRoute(
    name: "500-Error", 
    url: "Error", 
    defaults: new { controller = "Error", action = "Error" } 
); 

routes.MapRoute(
    name: "CatchAll", 
    url: "{*any}", 
    defaults: new { controller = "Error", action = "NotFound" }); 

는 경로가 내 컨트롤러의 일치되지 않은 경우 확인했다 그것을 ErrorController.NotFound 작업을 안전하게 경로 것.

의 의견, 나는 각각의 NotFound.shtmlViews/Shared 폴더에 페이지 된 Error.cshtml 생성하고 난 당신이 찾고 있던 생각입니다 루트 레이아웃에 대한 액세스 혜택.

결국 모든 요청이 처리기에서 관리되고 그에 따라 라우팅되기 때문에 더 이상 필요가 없으므로 customErrorshttpErrors을 모두 web.config에서 제거 할 수있었습니다.

이 구조의 원래 아이디어는 내 요구 사항에 맞는/해결 된 솔루션을 찾을 때까지 사용 가능한 옵션을 혼합하고 일치시킨이 기사에서 비롯된 것입니다.이 도움이

Exception handling in ASP.NET MVC (6 methods explained)

희망.

+0

이 보고서를 보내고 다시보고하겠습니다. 감사! –

+0

그래서이 작업을 수행 할 수 있었던 유일한 두 가지 방법은 ViewResult 뷰 = new ErrorsController (this.ControllerContext) .NotFound(); 그것은 어떤 이유로 컨트롤러가 NULL 컨텍스트를 얻는 다른 방법으로 이해하지만 실제로 HandleUnknownAction을 찾았습니다. 코드 자체가 this.View 뷰를 형식 인수를 받아 들일 수 없기 때문에 어쨌든이 작업을 수행 할 찾을 수 없습니다. –

+0

특정 항목으로 인해 약간의 조정을 통해이 기능이 작동하고 다른 사용자에게 권장 할만한 제품임을 알게되었습니다! –

4

나는 이것도 잘 쓰면서 오랫동안 수색했다. 내가 아는 한 동적 인 사용자 지정 오류 페이지를 만들 수있는 방법이 없다는 것을 알 수 있습니다.이 페이지는 .net 파이프 라인에 들어오지 않는 요청에 대한 IIS 오류를 처리합니다. 너처럼 두 개의 404 오류 페이지가 생겼다. .net 파이프 라인에 입력 된 요청으로 인한 파일을 찾을 수 없음 오류와 .net 파이프 라인에 입력하지 않은 파일을 찾을 수없는 요청에 대한 .html 파일 중 하나가 동적 .aspx입니다. 당신의 질문에 대해 답을 얻지 못한 사람은 당신이 아주 좋은, 어려운 질문을하고 있다는 것을 깨닫지 못했을 것입니다. 그것은 쉬운 해결책이 없습니다. 보상을 돕기 위해 귀하의 질문을 upvote 것입니다.

+0

나는보고있는 시간을 보냈지 만 정적 페이지를 가리키는 해답을 발견 한 사람은 갈 길이 멀었습니다. 그것은 내가 올바른 질문을하지 않을까 걱정했기 때문에 걱정을 덜어 주셔서 감사합니다. 정적 페이지를 고수하고 거기에서 할 수있는 일을 할 것입니다! –

+0

@RonC, 제 제안을보고이 시나리오에 적용될 수 있는지 확인하십시오. – Nkosi

+1

@ Nkoshi - 코드를 깊이 들여다 보지 않고 모든 가능한 요청을 dot net 파이프 라인으로 라우팅하는 것이 좋습니다. 이 경우 모든 404는 동적 .aspx 페이지에서 처리 할 수 ​​있습니다. 그러나 파이프 라인으로 라우팅하지 않는 IIS 오류에 대한 동적 aspx 페이지를 제공하는 방법의 근본적인 문제는 해결되지 않습니다. 또한 .net 파이프 라인을 통한 일상적인 * 모든 요청 (이미지 등)은 많은 개발자가 부담하고 싶지 않은 서버에 큰 성능 부담을 안겨줍니다. 제쳐두고, 나는 그들의 오류를 처리하기 위해 파이프 라인을 통해 .html 요청을 라우팅한다. –

관련 문제