response.Redirect ()를 호출 할 때 "HTTP 헤더가 전송 된 후 리디렉션 할 수 없음"을받는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/159523

문제

내가 전화 할 때 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.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). 응답을 위해.

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

사용return RedirectPermanent(myUrl) 나를 위해 일했습니다

이에 대한 간단한 답변이 하나 있습니다. 텍스트와 같은 다른 출력 또는 헤더를 보내기 전에 페이지의 출력과 관련된 내용이 있습니다. 이것은 당신이 그 오류를 얻는 이유에 영향을 미칩니다.

코드에서 입상 가능한 출력을 확인하거나 메소드 위에 헤더를 넣어 먼저 전송 될 수 있습니다.

헤더가 전송 된 후 리디렉션을 시도하는 경우 (예 : 부분적으로 생성 된 페이지에서 오류를 방향으로 리디렉션하는 경우) 일부 클라이언트 JavaScript (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 ( "CultureNabled", Routedata.Values)를 사용하여 문제를 해결했습니다. 응답 대신 .redirect.

리디렉션 기능은 아마도 '새로 고침'HTTP 헤더를 사용하여 작동 할 수 있습니다 (아마도 30x 코드도 사용). 헤더가 클라이언트로 전송되면 서버가 해당 명령을 너무 늦게 첨가 할 수있는 방법이 없습니다.

HTTP 헤더가 전송 된 후 리디렉션 할 수없는 경우 아래 코드를 사용해보십시오.

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

사용하지 않는지 확인하십시오 ResponseS '메소드와 같은 방법 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를 사용하고 동일한 컨트롤러에서 작업하고 다른 동작으로 리디렉션하는 경우 쓸 필요가 없습니다.
Response.Redirect ( "ActionName", "Control기 이름");
만 사용하는 것이 좋습니다
return retirecttoaction ( "actionName");
또는
return view ( "ViewName");

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

  1. 그냥 추가하십시오 return 당신의 다음 진술 Response.Redirect(someUrl);(메소드 서명이 "무효화"되지 않으면 물론 해당 "유형"을 반환해야합니다).

    response.redirect ( "login.aspx");

    반품;

참고 리턴을 통해 서버가 리디렉션을 수행 할 수 있습니다 ... 서버는 나머지 코드를 계속 실행하려고합니다 ...

  1. 너의 ~을 만들어라 Response.Redirect(someUrl) 예외를 던지는 방법에서 마지막으로 실행 된 문. 당신을 교체하십시오 Response.Redirect(someUrl) "sodoneurl"이라는 문자열 변수를 사용하여 리디렉션 위치로 설정합니다 ... 다음과 같이.

//......some code

string someUrl = String.Empty

..... 일부 논리

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

...... 더 많은 코드

// 응답을 이동 (메소드의 끝)로 삭제합니다.

Response.Redirect(someUrl);
return; 
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top