programing

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

nasanasas 2020. 10. 5. 08:02
반응형

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)나를 위해 일한 사용


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

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


헤더를 보낸 후 리디렉션을 시도하는 경우 (예 : 부분적으로 생성 된 페이지에서 오류 리디렉션을 수행하는 경우) 일부 클라이언트 자바 스크립트 (location.replace 또는 location.href 등)를 보낼 수 있습니다. 원하는 URL로 리디렉션합니다. 물론 이는 이미 전송 된 HTML에 따라 다릅니다.


내 문제는 "HTTP 헤더가 전송 된 후 리디렉션 할 수 없음"을 처리하기 위해 예외 처리기를 추가하여 해결되었습니다. 이 오류는 아래 코드와 같이

catch (System.Threading.ThreadAbortException)
        {
            // To Handle HTTP Exception "Cannot redirect after HTTP headers have been sent".
        }
        catch (Exception e)
        {//Here you can put your context.response.redirect("page.aspx");}

다음을 사용하여 문제를 해결했습니다. Response.RedirectToRoute ( "CultureEnabled", RouteData.Values); Response.Redirect 대신.


리디렉션 기능은 '새로 고침'http 헤더를 사용하여 작동 할 수 있습니다 (그리고 30X 코드도 사용할 수 있음). 헤더가 클라이언트로 전송되면 서버가 리디렉션 명령을 추가 할 방법이 없습니다. 너무 늦었습니다.


HTTP 헤더가 전송 된 후 리디렉션 할 수 없음이 표시되면 아래 코드를 시도하십시오.

HttpContext.Current.Server.ClearError();
// Response.Headers.Clear();
HttpContext.Current.Response.Redirect("/Home/Login",false);

리디렉션 부분 이전 Response과 같이 s의 방법을 사용하지 마십시오 Response.Flush();.


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

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

오류는 헤더가 전송 된 HTTP 후 리디렉션 할 수 없습니다.

System.Web.HttpException (0x80004005) : HTTP 헤더를 보낸 후 리디렉션 할 수 없습니다.

제안

asp.net mvc를 사용하고 동일한 컨트롤러에서 작업하고 다른 Action으로 리디렉션하면 작성할 필요가 없습니다 ..
Response.Redirect ( "ActionName", "ControllerName"); return RedirectToAction ( "ActionName");
만 사용하는 것이 더 좋습니다
.
또는
return View ( "ViewName");


이 문제를 해결하는 방법에는 두 가지가 있습니다.

  1. return다음과 같이 Response.Redirect(someUrl);(메서드 서명이 "void"가 아닌 경우 해당 "type"을 반환해야 합니다 .) 다음과 같이 명령문을 추가 하면됩니다.

    Response.Redirect ( "Login.aspx");

    반환;

반환은 서버가 리디렉션을 수행 할 수 있도록합니다 ... 그것없이 서버는 나머지 코드를 계속 실행하려고합니다 ...

  1. Make your Response.Redirect(someUrl) the LAST executed statement in the method that is throwing the exception. Replace your Response.Redirect(someUrl) with a string VARIABLE named "someUrl", and set it to the redirect location... as follows:

//......some code

string someUrl = String.Empty

.....some logic

if (x=y)
{
    // comment (original location of Response.Redirect("Login.aspx");)
    someUrl = "Login.aspx";
}

......more code

// MOVE your Response.Redirect to HERE (the end of the method):

Response.Redirect(someUrl);
return; 

참고URL : https://stackoverflow.com/questions/159523/why-do-i-get-cannot-redirect-after-http-headers-have-been-sent-when-i-call-res

반응형