IIS7은 Response.StatusCode를 설정할 때 customErrors를 무시합니까?


98

여기에 이상한 문제가 있습니다. web.config customErrors섹션을 사용하여 사용자 지정 오류 페이지를 만들면 Response.StatusCode적절한 것으로 설정해야한다는 것을 누구나 알고 있습니다 . 예를 들어 사용자 지정 404 페이지를 만들고 이름을 404.aspx로 지정 <% Response.StatusCode = 404 %>하면 내용을 입력하여 실제 404 상태 헤더를 가질 수 있습니다.

지금까지 나를 따라와? 좋은. 이제 IIS7에서 이것을 시도하십시오. 나는 그것을 작동시킬 수 없다. Response.StatusCode사용자 지정 오류 페이지에이 설정되어 있으면 IIS7은 사용자 지정 오류 페이지를 완전히 무시하고 자체 상태 페이지를 표시합니다 (구성된 경우).

이 동작을 본 사람이 있고 해결 방법을 알고있는 사람이 있습니까? IIS6에서 작동했기 때문에 상황이 변경된 이유를 모르겠습니다.

참고 : 이것은 404 Not Found 대신 200 OK를 반환하는 ASP.NET Custom 404 의 문제와 동일 하지 않습니다.



Bobby, 실제로 그 질문을 찾아서 시도했지만 문제가 해결되지 않았습니다. 하지만 감사합니다.
Nicholas

이 문제는 Classic에서 Integrated pipeine으로 전환 할 때도 발생한다고 언급하고 싶습니다. @PavelChuchuva 솔루션을 사용했습니다 (@RickStrahl 솔루션도 작동합니다). 나는 .. 클래식에서 "통과"는이 서버의 글로벌 오류 페이지 처리 소요 통합에 자동으로 추측하고있어
sonjz

답변:


116

system.webServer / httpErrors 섹션에서 existingResponse를 PassThrough로 설정합니다.

  <system.webServer>
    <httpErrors existingResponse="PassThrough" />
  </system.webServer>

existingResponse 속성의 기본값은 Auto입니다.

Auto는 사용자 정의 오류 모듈에 올바른 작업 을 수행하도록 지시 합니다. 클라이언트에 표시되는 실제 오류 텍스트는 IHttpResponse::GetStatus호출 에서 반환 된 fTrySkipCustomErrors 값에 따라 영향을받습니다 . fTrySkipCustomErrors가 true로 설정되면 사용자 정의 오류 모듈이 응답을 통과하도록 허용하지만 false로 설정되면 사용자 정의 오류 모듈이 텍스트를 자체 텍스트로 대체합니다.

추가 정보 : IIS7 사용자 지정 오류 모듈에서 기대할 수있는 사항


3
existingResponse를 PassThrough로 설정하면 부작용이 발생할 수 있습니다. 변경하기 전에 Pavel에서 제공하는 링크를 마스터하십시오.
Lex Li

인가 <httpErrors existingResponse="PassThrough" />에 해당 Response.TrySkipIisCustomErrors하거나 다르게 작동합니까?
Asbjørn Ulsberg

1
@sbjornu 그들은 똑같은 것을 달성하지만 Response.TrySkipIisCustomErrorsIIS 사용자 정의 오류를 표시 할 때 더 나은 제어를 얻을 수 있습니다.
Pavel Chuchuva 2011

고마워요, response.tryskipiiscustomerrors에 대한 많은 정보를 보았지만 기존 응답에 대해서는 많이 보지 못했습니다.
HBCondo 2012

IIS7을 실행하는 웹 호스트에서 사용자 지정 오류 페이지가 작동하지 않는 문제를 간단히 기존 Response = "Auto"로 설정하여 해결했습니다.이 기사는 기본값 인 주장을 참조했기 때문에 매우 놀랐습니다. 그것은 분명히 아닙니다 ... 또는 내 호스팅 회사가 다른 곳에서 잘못된 기본값을 설정했다고 생각합니다. 누군가에게 몇 시간을 절약 어느 쪽이든의 I 희망 : \
에릭 Sassaman

80

동작을 일관되게 만드는 가장 쉬운 방법은 오류를 지우고 Response.TrySkipIisCustomErrors 를 사용하고이를 true로 설정하는 것입니다. 이는 페이지 내에서 처리되는 IIS 전역 오류 페이지 또는 Application_Error의 전역 오류 처리기를 재정의합니다.

Server.ClearError();
Response.TrySkipIisCustomErrors = true;

일반적으로 애플리케이션 오류 핸들러가 포착하지 못하는 모든 오류를 처리하는 Application_Error 핸들러에서이 작업을 수행해야합니다.

더 자세한 정보는 다음 블로그 게시물에서 찾을 수 있습니다. http://www.west-wind.com/weblog/posts/745738.aspx


2
이것은 나에게도 작동하지 않으며 (IIS8) 조언이 OP와 일치하지 않는 것 같습니다 (제대로 읽고 있다고 가정). 내가 원하는customError 트리거의 Web.config 구성. 로 Response.TrySkipIisCustomErrors = true못생긴 서버에서 생성되는 오류 페이지가 표시됩니다 : I 동일한 동작을 얻을. false아무것도 설정 하지 않으면 빈 브라우저 창이 나타납니다.
Shawn South

나를 위해 잘 작동했습니다! Pavel Chuchuva가 그의 답변에서 언급 한 설정도 효과가 있었지만 다른 문제를 일으키는 부작용이있었습니다. 이 설정을 사용하면 원하는 특정 시나리오에서 IIS 오류 재정의를 건너 뛰고 다른 모든 동작은 그대로 둡니다.
Kevin Tighe

나를 위해 Azure에서 잘 작동했습니다. 서버 헤더Server:Microsoft-IIS/8.5 X-AspNet-Version:4.0.30319 X-AspNetMvc-Version:5.2 X-Powered-By:ASP.NET
oxfn 2015 년

customErrors mode="Off"이 작업을 수행 하려면 여전히 설정해야합니다 . 그렇게하면이 답변의 코드를 사용할 때 httpErrors existingResponse = "Auto"(기본값)가 제대로 작동합니다.
AaronLS

11

해결됨 : IIS7에서 오류 페이지를 "통과"하려면 "상세 오류"가 켜져 있어야합니다. http://forums.iis.net/t/1146653.aspx 참조


1
이 답변이 답변으로 표시되었지만 주제에 대한 더 많은 통찰력을 얻기 위해 다른 답변을 읽는 것이 가치가 있다고 생각합니다.
Lex Li

또한 제거하는 것이 좋습니다. FilterConfig의 HandleErrorAttribute
G 기준 '

4

이것이 본질적으로 유사한 지 아닌지는 확실하지 않지만 표면적으로 비슷하게 들리는 문제를 해결했으며 여기에 처리 방법이 있습니다.

우선, existingResponse (Auto)의 기본값이 제 경우에는 정답이었습니다. 사용자 지정 404, 400 및 500이 있기 때문입니다 (다른 항목을 만들 수 있지만이 세 가지로 충분합니다). 저에게 도움이 된 관련 섹션은 다음과 같습니다.

web.config에서 :

<customErrors mode="Off" />

<httpErrors errorMode="Custom" existingResponse="Auto" defaultResponseMode="ExecuteURL">
  <clear />
  <error statusCode="404" path="/errors/404.aspx" responseMode="ExecuteURL" />
  <error statusCode="500" path="/errors/500.aspx" responseMode="ExecuteURL" />
  <error statusCode="400" path="/errors/400.aspx" responseMode="ExecuteURL" />
</httpErrors>

거기에서 나는 이것을 global.asax의 Application_Error에 추가했습니다.

    Response.TrySkipIisCustomErrors = True

각 사용자 지정 오류 페이지에 올바른 응답 상태 코드를 포함해야했습니다. 제 경우에는 사용자를 내 사이트의 다른 섹션으로 보내기 위해 사용자 지정 404를 사용하고 있으므로 실제로 죽은 페이지가 아닌 한 404 상태 코드가 반환되는 것을 원하지 않습니다 .

어쨌든, 그렇게 했어요. 누군가에게 도움이되기를 바랍니다.


3

이 문제는 큰 골칫거리였습니다. 이전에 언급 한 제안 중 어느 것도 나에게 해결되지 않았으므로 내 솔루션을 포함하고 있습니다. 기록을 위해 우리의 환경 / 플랫폼은 다음을 사용합니다.

  • .NET Framework 4
  • MVC 3
  • IIS8 (워크 스테이션) 및 IIS7 (웹 서버)

특히 사용자를 Web.config 설정을 통해 사용자 지정 404 페이지로 리디렉션하는 HTTP 404 응답을 얻으려고했습니다.

첫째, 내 코드는 HttpException. NotFoundResult컨트롤러에서 a 를 반환 해도 내가 원하는 결과를 얻지 못했습니다.

throw new HttpException(404, "There is no class with that subject");

그럼 구성해야했습니다 모두customErrorshttpError의 Web.config의 노드.

<customErrors mode="On" defaultRedirect="/classes/Error.aspx">
  <error statusCode="404" redirect="/classes/404.html" />
</customErrors>

...

<httpErrors errorMode="Custom" existingResponse="Auto" defaultResponseMode="ExecuteURL">
  <clear />
  <error statusCode="404" path="/classes/404.aspx" responseMode="ExecuteURL" />
</httpErrors>

참고 난을 떠났다 existingResponseAuto제공되는 솔루션 @sefl 다른이다.

customErrors설정 내 명시 적으로 발생 처리에 필요한 것으로 나타났다 HttpException그동안, httpErrors노드가 Globals.asax.cs에 지정된 경로 패턴의 외부 떨어졌다 URL을 처리.

추신 :이 설정으로 나는 설정할 필요가 없었습니다 Response.TrySkipIisCustomErrors


2

TrySkipIisCustomErrors퍼즐의 일부일뿐입니다. 사용자 정의 오류 페이지를 사용하지만 4xx 상태를 기반으로 일부 RESTful 콘텐츠를 제공하려는 경우 문제가 있습니다. web.config의 httpErrors.existingResponse를 "Auto"로 설정해도 작동하지 않습니다. .net은 항상 일부 페이지 콘텐츠를 IIS에 전달하는 것처럼 보이므로 "자동"을 사용하면 모든 (또는 적어도 일부) 사용자 지정 오류 페이지가 사용되지 않습니다. 응답에 http 상태 코드가 포함되기 때문에 "바꾸기"를 사용하는 것도 작동하지 않지만 그 내용은 비어 있거나 사용자 지정 오류 페이지로 채워집니다. 그리고 "PassThrough"는 실제로 CEP를 끄므로 사용할 수 없습니다.

따라서 일부 경우에 CEP를 우회하려는 경우 (일부 콘텐츠와 함께 상태 4xx를 반환 함을 의미 함) 추가 단계가 필요합니다. 오류를 정리합니다.

void Application_Error(object sender, EventArgs e)
{
    var httpException = Context.Server.GetLastError() as HttpException;
    var statusCode = httpException != null ? httpException.GetHttpCode() : (int)HttpStatusCode.InternalServerError;

    Context.Server.ClearError();
    Context.Response.StatusCode = statusCode;
}

따라서 REST 응답 (예 : 400-잘못된 요청)을 사용하고 일부 콘텐츠를 보내려면 TrySkipIisCustomErrors실행중인 위치 를 설정 existingResponse하고 web.config의 httpErrors 섹션에서 "자동"으로 설정 하면됩니다. 지금:

  • 오류가없고 (작업이 4xx 또는 5xx를 반환 함) 일부 콘텐츠가 반환되면 CEP가 사용되지 않고 콘텐츠가 클라이언트에 전달됩니다.
  • 오류 (예외 발생)가 발생하면 오류 처리기가 반환 한 내용이 제거되므로 CEP가 사용됩니다.

작업에서 빈 내용으로 상태를 반환하려면 빈 응답으로 처리되고 CEP가 표시되므로이 코드를 개선 할 여지가 있습니다.


0

기본적으로 IIS 7은 자세한 사용자 지정 오류 메시지를 사용하므로 Response.StatusCode가 404가 아닌 404.XX와 동일하다고 가정합니다.

더 간단한 오류 메시지 코드를 사용하도록 IIS7을 구성하거나 IIS7이 제공하는 더 자세한 오류 메시지를 처리하는 코드를 수정할 수 있습니다.

자세한 정보는 http://blogs.iis.net/rakkimk/archive/2008/10/03/iis7-enabling-custom-error-pages.aspx에서 확인할 수 있습니다.

추가 조사에 따르면 잘못된 방법이 있음이 밝혀졌습니다. 자세한 메시지는 기본적으로 표시되지 않지만 언급 한 다른 오류 메시지가 표시되는 경우 상자에 켜져있을 수 있습니다.


Response.StatusCode는 정수이므로 "404"보다 더 구체적인 코드를 설정하는 방법이 보이지 않습니다. URL이 나타내는 것처럼 사용자 지정 오류 페이지를 사용 / 표시하도록 IIS7을 구성했습니다.
Nicholas

흠 ... 안타깝게도 지금은 가정용 PC가 아니기 때문에 테스트를 할 수 없습니다. 그때까지 해결책이 없다면 오늘 밤에 볼게요.
nullnvoid
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.