전화 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");
endResponse
)를 true로 설정하여 Redirect를 호출하는 것과 같습니다 ."
Response.IsRequestBeingRedirected
에서 거짓이며 여전히 동일한 예외가 발생합니다 ( Application_EndRequest
Global.asax의 이벤트 메서드 내부 ). 이유를 이해할 수 없습니다.
콘텐츠를 클라이언트에 보내면 HTTP 헤더가 이미 전송되었습니다. Response.Redirect()
호출은 브라우저가 다른 URL을 요청할 수 있도록 헤더의 특별한 정보를 전송하여 작동합니다.
헤더가 이미 전송되었으므로 asp.net은 원하는 작업을 수행 할 수 없습니다 (헤더 수정).
a) 다른 작업을 수행하기 전에 리디렉션을 수행하거나 b) Response.Buffer = true
다른 작업을 수행하기 전에 사용 을 시도하여 전체 페이지가 실행될 때까지 출력이 클라이언트에 전송되지 않도록 할 수 있습니다.
리디렉션은 HTTP 메시지의 첫 번째 줄이 " HTTP/1.x 3xx Redirect Reason
"인 경우에만 발생할 수 있습니다 .
이미 Response.Write()
일부 헤더를 호출 하거나 설정 했다면 리디렉션하기에 너무 늦을 것입니다. Response.Headers.Clear()
리디렉션 전에 전화를 걸어 도움이되는지 확인할 수 있습니다 .
return RedirectToAction("Logout", "Authentication");
하고 난 그 오류 얻을
버퍼링 옵션을 false로 설정했는지 확인하십시오 (기본적으로 true). response.redirect가 작동하려면
Response.BufferOutput = true;
액션, 컨트롤러?
이에 대한 간단한 대답이 하나 있습니다. 헤더를 보내기 전에 텍스트 또는 페이지의 출력과 관련된 다른 것을 출력했습니다. 이는 해당 오류가 발생하는 이유에 영향을줍니다.
가능한 출력에 대한 코드를 확인하거나 헤더를 메소드 맨 위에 놓아 먼저 전송되도록 할 수 있습니다.
내 문제는 "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");}
오류는
헤더가 전송 된 HTTP 후 리디렉션 할 수 없습니다.
System.Web.HttpException (0x80004005) : HTTP 헤더를 보낸 후 리디렉션 할 수 없습니다.
제안
asp.net mvc를 사용하고 동일한 컨트롤러에서 작업하고 다른 Action으로 리디렉션하는 경우에는 쓸 필요가 없습니다 ..
Response.Redirect ( "ActionName", "ControllerName"); return RedirectToAction ( "ActionName");
만 사용하는 것이 더 좋습니다
.
또는
return View ( "ViewName");
이 문제를 해결하는 방법에는 두 가지가 있습니다.
return
다음과 같이 Response.Redirect(someUrl);
(메서드 서명이 "void"가 아닌 경우 해당 "type"을 반환해야 합니다) 뒤에 문을 추가 하면됩니다.
Response.Redirect ( "Login.aspx");
반환;
반환은 서버가 리디렉션을 수행 할 수 있도록합니다 ... 그것없이 서버는 나머지 코드를 계속 실행하려고합니다 ...
Response.Redirect(someUrl)
예외를 던지고 방법에서 마지막으로 실행 된 문을. 당신의 교체 Response.Redirect(someUrl)
로 다음과 ... "someUrl"라는 문자열 변수로하고, 리디렉션 위치로 설정합니다 ://......some code
string someUrl = String.Empty
..... 일부 논리
if (x=y)
{
// comment (original location of Response.Redirect("Login.aspx");)
someUrl = "Login.aspx";
}
...... 더 많은 코드
// Response.Redirect를 HERE (메서드의 끝)로 이동합니다.
Response.Redirect(someUrl);
return;
return
는 무엇을해야합니까 (무효 반환 방법에서) ? 는 return
유일한 방법이 완료된 것으로 정의한다. 그러나 코드가 남아 있지 않으면 어쨌든 메서드가 완료됩니다. 그리고 변수에 URL을 저장하는 것은 아무것도 변경하지 않습니다. 문자열은 동일합니다. 컴파일 된 것은 문자열과 문자열을 포함하는 변수 사이에 어떤 차이도 만들지 않습니다 ... : 생각해보세요. x = 5
x는 5이지만 5도 5입니다. 10/2도 5가됩니다 ... 둘 다 차이가 없습니다