[asp.net] Response.Redirect ()를 호출 할 때 “HTTP 헤더를 보낸 후 리디렉션 할 수 없습니다”라는 메시지가 나타나는 이유는 무엇입니까?

전화 Response.Redirect(someUrl)하면 다음과 같은 HttpException이 발생합니다.

HTTP 헤더를 보낸 후에는 리디렉션 할 수 없습니다.

왜 이것을 얻습니까? 이 문제를 어떻게 해결할 수 있습니까?



답변

에 대한 MSDN 설명서에 따르면 Response.Redirect(string url)“HTTP 헤더가 전송 된 후 리디렉션이 시도 될 때”HttpException이 발생합니다. 때문에 Response.Redirect(string url)용도는 HTTP “위치”응답 헤더 ( http://en.wikipedia.org/wiki/HTTP_headers#Responses )를 호출하면 헤더를 클라이언트로 전송하게됩니다. 즉, 두 번째로 호출하거나 헤더를 다른 방식으로 전송 한 후에 호출하면 HttpException이 발생합니다.

Response.Redirect ()를 여러 번 호출하지 않도록 보호하는 한 가지 방법은 Response.IsRequestBeingRedirected호출하기 전에 속성 (bool) 을 확인 하는 것입니다.

// Causes headers to be sent to the client (Http "Location" response header)
Response.Redirect("http://www.stackoverflow.com");
if (!Response.IsRequestBeingRedirected)
    // Will not be called
    Response.Redirect("http://www.google.com");


답변

콘텐츠를 클라이언트에 보내면 HTTP 헤더가 이미 전송되었습니다. Response.Redirect()호출은 브라우저가 다른 URL을 요청할 수 있도록 헤더의 특별한 정보를 전송하여 작동합니다.

헤더가 이미 전송되었으므로 asp.net은 원하는 작업을 수행 할 수 없습니다 (헤더 수정).

a) 다른 작업을 수행하기 전에 리디렉션을 수행하거나 b) Response.Buffer = true다른 작업을 수행하기 전에 사용 을 시도하여 전체 페이지가 실행될 때까지 출력이 클라이언트에 전송되지 않도록 할 수 있습니다.


답변

리디렉션은 HTTP 메시지의 첫 번째 줄이 ” HTTP/1.x 3xx Redirect Reason“인 경우에만 발생할 수 있습니다 .

이미 Response.Write()일부 헤더를 호출 하거나 설정 했다면 리디렉션하기에 너무 늦을 것입니다. Response.Headers.Clear()리디렉션 전에 전화를 걸어 도움이되는지 확인할 수 있습니다 .


답변

버퍼링 옵션을 false로 설정했는지 확인하십시오 (기본적으로 true). response.redirect가 작동하려면

  1. 버퍼링이 참이어야합니다.
  2. 기본 버퍼 크기를 초과하는 response.write를 사용하여 더 많은 데이터를 보내지 않아야합니다 (이 경우 자체적으로 플러시되어 헤더가 전송 됨). 따라서 리디렉션을 허용하지 않습니다.


답변

return RedirectPermanent(myUrl)나를 위해 일한 사용


답변

아래에 언급 된 코드를 사용할 수도 있습니다.

Response.Write("<script type='text/javascript'>"); Response.Write("window.location = '" + redirect url + "'</script>");Response.Flush();


답변

이에 대한 간단한 대답이 하나 있습니다. 헤더를 보내기 전에 텍스트 또는 페이지의 출력과 관련된 다른 것을 출력했습니다. 이는 해당 오류가 발생하는 이유에 영향을줍니다.

가능한 출력에 대한 코드를 확인하거나 헤더를 메소드 맨 위에 놓아 먼저 전송되도록 할 수 있습니다.