공유 호스트에 배포 한 ASP.NET MVC 응용 프로그램에서 사용자 정의 오류에 문제가 있습니다. ErrorController를 생성하고 처리되지 않은 예외를 잡아 내 로그에 기록한 다음 제어를 ErrorController에 전달하여 사용자 지정 오류를 표시하기 위해 Global.asax에 다음 코드를 추가했습니다. 로깅이 잘 작동하기 때문에ASP.NET MVC app 사용자 정의 오류 페이지가 공유 호스팅 환경에 표시되지 않습니다.
protected void Application_Error(object sender, EventArgs e)
{
Exception ex = Server.GetLastError();
Response.Clear();
HttpException httpEx = ex as HttpException;
RouteData routeData = new RouteData();
routeData.Values.Add("controller", "Error");
if (httpEx == null)
{
routeData.Values.Add("action", "Index");
}
else
{
switch (httpEx.GetHttpCode())
{
case 404:
routeData.Values.Add("action", "HttpError404");
break;
case 500:
routeData.Values.Add("action", "HttpError500");
break;
case 503:
routeData.Values.Add("action", "HttpError503");
break;
default:
routeData.Values.Add("action", "Index");
break;
}
}
ExceptionLogger.LogException(ex); // <- This is working. Errors get logged
routeData.Values.Add("error", ex);
Server.ClearError();
IController controller = new ErrorController();
// The next line doesn't seem to be working
controller.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
}
함으로써 Application_Error 확실히 발사 않으며, 대신 내 사용자 지정 오류 페이지를 표시하는, 내가 가서 아빠 일반적인 것들을 얻을 :이 코드는 here에서 가져옵니다. 위의 코드는 블로그 게시물의 제목에서 가져온 것입니다. MVC 프레임 워크의 Release Candidate 2를 사용합니다. 1.0에서 코드의 마지막 줄이 작동하지 않는 변화가 있었습니까? 평소대로 works great on my machine.
모든 의견을 크게 기뻐할 것입니다.
편집 : Web.config (Off, On 및 RemoteOnly)의 customErrors 모드에 대해 3 가지 가능성을 모두 시도했음을 잊어 버렸습니다. 이 설정에 관계없이 같은 결과가 나타납니다.
편집 2 : 컨트롤러 클래스의 [HandleError] 데코레이션을 사용하거나 사용하지 않고 시도해 보았습니다.
업데이트 : 404를 알아 냈습니다. Go Daddy의 Hosting Control Center에는 404 동작을 제어 할 수있는 설정 패널 섹션이 있으며 기본값은 일반 페이지를 표시하는 것으로,이 설정은 Web.config 설정보다 우선합니다. 그래서 내 맞춤 404 페이지가 이제 의도 한대로 표시됩니다. 그러나 500s와 503s는 여전히 작동하지 않습니다.
public static HomeContent GetStaticContent()
{
HomeContent hc;
try
{
string path = Configuration.CcmConfigSection.Config.Content.PathToStaticContent;
string fileText = File.ReadAllText(path);
string regex = @"^[^#]([^\r\n]*)";
MatchCollection matches = Regex.Matches(fileText, regex, RegexOptions.Multiline);
hc = new HomeContent
{
ID = Convert.ToInt32(matches[0].Value),
Title = matches[1].Value,
DateAdded = DateTime.Parse(matches[2].Value),
Body = matches[3].Value,
IsCurrent = true
};
}
catch (Exception ex)
{
try
{
ExceptionLogger.LogException(ex);
}
catch
{
// couldn't log exception, continue without crashing
}
hc = null;
}
return hc;
}
: 여기
public ActionResult Index()
{
CcmDataClassesDataContext dc = new CcmDataClassesDataContext();
// This might generate an exception which will be handled in the OnException override
HomeContent hc = dc.HomeContents.GetCurrentContent();
ViewData["bodyId"] = "home";
return View(hc);
}
protected override void OnException(ExceptionContext filterContext)
{
// Only concerned here with SqlExceptions so an HTTP 503 message can
// be displayed in the Home View. All others will bubble up to the
// Global.asax.cs and be handled/logged there.
System.Data.SqlClient.SqlException sqlEx =
filterContext.Exception as System.Data.SqlClient.SqlException;
if (sqlEx != null)
{
try
{
ExceptionLogger.LogException(sqlEx);
}
catch
{
// couldn't log exception, continue without crashing
}
ViewData["bodyId"] = "home";
filterContext.ExceptionHandled = true;
HomeContent hc = ContentHelper.GetStaticContent();
if (hc == null)
{
// Couldn't get static content. Display friendly message on Home View.
Response.StatusCode = 503;
this.View("ContentError").ExecuteResult(this.ControllerContext);
}
else
{
// Pass the static content to the regular Home View
this.View("Index", hc).ExecuteResult(this.ControllerContext);
}
}
}
가 정적 콘텐츠를 가져 오기 위해 시도하는 코드이다 : 나는 다음과 같이 SQL Server가 예외가 발생하면 콘텐츠의 정적 텍스트 버전을 잡기 위해 HomeController 코드를 가지고
SqlException을 생성하도록 연결 문자열을 변경하면 코드가 오류를 올바르게 기록한 다음 정적 콘텐츠를 잡고 표시한다는 것을 확인했습니다. 그러나 Web.config의 정적 텍스트 파일 경로를 변경하여 홈 뷰의 503 버전을 테스트하면 "서비스를 사용할 수 없음"이외의 다른 페이지가 표시됩니다. 그게 전부 야. 사이트의 모양과 느낌이있는 맞춤형 503 메시지가 없습니다.
누구든지 도움이 될만한 코드 개선에 대한 제안 사항이 있습니까? HttpResponse에 다른 헤더를 추가하는 것이 도움이 될까요? 아니면 아빠가 503을 무자비하게 납치 한 것입니까?
+1 감사합니다, Bryan. 2 시간 이상 검색하면 필요한 답을 나에게주었습니다. 매우 간단합니다. 나에게 보안 예외를주고 404 오류 코드를 설정하려고 "Response.TrySkipIisCustomErrors = true;" 고쳤다. –
이것은 나를 미치게 만들었다. 정말 고맙습니다. 배치 "Response.TrySkipIisCustomErrors = true;" 내 오류 컨트롤러에서 응답 코드를 설정 한 직후에 저에게 효과가있었습니다. 내 로컬 IIS 7 인스턴스가 사용자 지정 오류보기를 렌더링했기 때문에 오해의 소지가 있었지만 원격 준비 서버는 그렇지 않았습니다. = P – NovaJoe
나는이 답변에서 제공되는 것을 적용한 후에 같은 배에 있었다 : http://stackoverflow.com/a/7499406/114029. 'Response.TrySkipIisCustomErrors = true;는 천국에서옵니다! :) –