programing

IIS7 응답을 설정할 때 사용자 지정 오류를 재정의합니다.상태 코드?

golfzon 2023. 5. 4. 20:49
반응형

IIS7 응답을 설정할 때 사용자 지정 오류를 재정의합니다.상태 코드?

여기 이상한 문제가 있어요. web.config's 를다사모알있습니고두를 하면 누구나 알고 .customErrors페이지를 사용자 오류 페이지를 .Response.StatusCode어떤 것이든 적절할 것입니다.예를 들어, 사용자 정의 404 페이지를 만들고 이름을 404.aspx로 지정하면 다음과 같이 입력할 수 있습니다.<% Response.StatusCode = 404 %>내용에서 실제 404 상태 헤더를 갖도록 합니다.

지금까지 따라오셨나요?좋습니다. 이제 IIS7에서 이 작업을 수행해 보십시오.난 그것을 작동시킬 수 없어, 시간.한다면Response.StatusCode사용자 지정 오류 페이지에 설정되어 있고 IIS7이 사용자 지정 오류 페이지를 완전히 재정의한 것으로 보이며 자체 상태 페이지가 표시됩니다(구성된 경우).

이런 행동을 본 사람이 또 있을까요? 그리고 어떻게 해결해야 할지 알고 있나요?그것은 IIS6에서 작동하고 있었는데, 왜 상황이 바뀌었는지 모르겠습니다.

참고: 이는 ASP의 문제와 다릅니다.NET 사용자 정의 404를 찾을 수 없음 404 대신 200 OK를 반환합니다.

기존 응답을 통과로 설정시스템을 통과합니다.webServer/httpErrors 섹션:

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

기존 Response 속성의 기본값은 Auto:

자동은 사용자 지정 오류 모듈에 올바른 작업을 지시합니다.반환되는 fTrySkipCustomErrors 값에 따라 클라이언트에 표시되는 실제 오류 텍스트가 영향을 받습니다.IHttpResponse::GetStatustrue로 하면 사용자 이 텍스트를 로 바꿉니다ftTrySkipCustomErrors true는 false로 설정됩니다.

추가 정보:IIS7 사용자 지정 오류 모듈에서 예상되는 내용

동작을 일관되게 만드는 가장 쉬운 방법은 오류를 지우고 응답을 사용하는 것입니다.SkipIisCustomErrors를 true로 설정합니다.이렇게 하면 페이지 내의 IIS 글로벌 오류 페이지 처리 또는 Application_Error의 글로벌 오류 처리기가 재정의됩니다.

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

일반적으로 응용 프로그램 오류 처리기가 감지하지 못하는 모든 오류를 처리하는 응용 프로그램_오류 처리기에서 이 작업을 수행해야 합니다.

자세한 내용은 다음 블로그 게시물에서 확인할 수 있습니다. http://www.west-wind.com/weblog/posts/745738.aspx

해결됨: IIS7이 오류 페이지를 "통과"하려면 "상세 오류"가 설정되어 있어야 합니다.http://forums.iis.net/t/1146653.aspx 을 참조하십시오.

이것이 본질적으로 비슷한 것인지 아닌지는 잘 모르겠습니다만, 겉으로 보기에는 비슷한 것처럼 들리는 문제를 해결했고 처리 방법은 이렇습니다.

우선 기존 응답(자동)의 기본값은 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 상태 코드가 데드 페이지가 아닌 경우에는 반환되지 않습니다.

아무튼 그렇게 했어요.누군가에게 도움이 되길 바랍니다.

이 문제는 큰 골칫거리였습니다.이전에 언급한 제안 중 어느 것도 저에게 해결되지 않았기 때문에 저는 제 해결책을 포함합니다.참고로 당사의 환경/플랫폼은 다음을 사용합니다.

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

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

첫번째로, 내 코드는 하나를 던져야 했습니다.HttpException 반환NotFoundResult제가 원하는 결과를 얻지 못했습니다.

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

그런 다음 두 가지를 모두 구성해야 했습니다.customErrors그리고.httpErrorconfig.dll.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>

참고로 나는 다음을 떠났습니다.existingResponse~하듯이Auto이는 제공된 솔루션 @sefl과 다릅니다.

customErrors설정은 내가 명시적으로 던진 것을 처리하는 데 필요한 것처럼 보였습니다.HttpException天皇가 동안에이사.httpErrors노드에서 Globals.asax.cs 에 지정된 경로 패턴을 벗어나는 URL을 처리했습니다.

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

TrySkipIisCustomErrors퍼즐의 일부일 뿐입니다.사용자 정의 오류 페이지를 사용하지만 4xx 상태를 기반으로 일부 RESTful 콘텐츠도 제공하려는 경우 문제가 발생합니다.web.config(으) httpErrors.existingResponse(httpErrors.기존 응답) "Auto(자동)"라는 파일이 있습니다. 왜냐하면 .net은 항상 일부 페이지 내용을 IIS에 전달하는 것처럼 보이므로 "Auto"를 사용하면 모든(또는 적어도 일부) 사용자 정의 오류 페이지가 사용되지 않습니다.응답에는 http 상태 코드가 포함되지만 내용은 비어 있거나 사용자 정의 오류 페이지로 채워지므로 "바꾸기"를 사용해도 작동하지 않습니다. ""는 사실 꺼서 .through"는 사실 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 - Bad Request)을 사용하고 이 응답과 함께 일부 콘텐츠를 전송하려면 설정하기만 하면 됩니다.TrySkipIisCustomErrors어디선가 활동하고 있는existingResponseweb.config() httpErrors()는 "Auto"(자동)입니다.

  • 오류가 없고(액션이 4xx 또는 5xx) 일부 콘텐츠가 반환되는 경우 CEP가 사용되지 않고 콘텐츠가 고객에게 전달됩니다.
  • 오류가 발생하면(예외가 발생함) 오류 처리기에서 반환한 내용이 제거되므로 CEP가 사용됩니다.

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

기본적으로 IIS 7은 자세한 사용자 지정 오류 메시지를 사용하므로 응답으로 간주합니다.상태 코드는 404입니다.404개가 아니라 XX개입니다.

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

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

추가 조사 결과, 제가 잘못 알고 있었다는 것이 드러났습니다. 자세한 메시지는 기본적으로 표시되지 않지만, 언급한 다른 오류 메시지를 볼 경우 상자에 표시되었을 수 있습니다.

언급URL : https://stackoverflow.com/questions/434272/iis7-overrides-customerrors-when-setting-response-statuscode

반응형