서버. 전송 대. 응답. 리디렉션


263

차이 무엇 Server.TransferResponse.Redirect?

  • 각각의 장단점은 무엇입니까?
  • 하나는 언제 다른 것보다 적절한가?
  • 언제 적절하지 않은가?

3
장단점은 아래 사이트에 명시되어 있습니다. developer.com/net/asp/article.php/3299641 이 기사에서 흥미로운 점은 Server.Transfer가 Server.Redirect와 비교하여 더 많은 서버 전력을 소비한다는 것입니다.
Ray Lu

Server.Transfer는 페이지 요청을 줄이므로 그 점에서 페이지 요청이 더 낫습니다. 그러나 Response.Redirect는 사용자를 외부 사이트로 보낼 수 있지만 Server.Transfer는 할 수 없습니다.
codeConcussion

1
IIS 7 통합 모드에서 실행중인 경우 Server.TransferRequest대신 대신 사용 을 고려할 수 있습니다 Server.Transfer.
Haacked

@Haacked는 처음에 Server.TransferRequest가 웹 매트릭스와 iis7의 문제를 해결했음을 읽었을 것입니다. 그라시아 스. 그들은 그것을 여기에 두어야합니다.
Jason Sebring

답변:


234

Response.Redirect단순히 브라우저로 메시지 (HTTP 302) 를 보냅니다 .

Server.Transfer 브라우저가 아무것도 모르는 경우 브라우저가 페이지를 요청하지만 서버는 다른 내용을 반환합니다.


웹 매트릭스가있는 CSHTML 페이지에서 작동합니까? Server.Transfer ( "~ / somepage.cshtml", true)와 같은 CSHTML 페이지로 Server.Transfer를 수행 할 때 작동하지 않는 것 같지만 다른 유형의 페이지에서는 작동하는 것 같습니다. 예, 면도기가 설치되어 있고 페이지가 예상대로 작동합니다.
Jason Sebring

11
이봐 요 cshtml 웹 매트릭스 페이지에는 Server.TransferRequest를 사용해야합니다.
Jason Sebring

Server.Transfer ()는 실제 페이지로만 전송합니까? 예를 들어. Server.Transfer ( "default / category1.aspx")로 전송하면 기본 폴더와 category1, aspx 페이지가 있어야합니까?
ihimv

95

Response.Redirect()새 페이지로 이동하여 주소 표시 줄을 업데이트 한 후 브라우저 기록에 추가합니다. 브라우저에서 뒤로를 클릭 할 수 있습니다.

Server.Transfer()주소 표시 줄을 변경하지 않습니다. 반격 할 수 없습니다.

Server.Transfer()사용자가 내가가는 곳을보고 싶지 않을 때 사용 합니다. 때때로 "로드 중"유형 페이지에서.

그렇지 않으면 항상을 사용 Response.Redirect()합니다.


75

짧게 : Response.Redirect단순히 다른 페이지를 방문하도록 브라우저에 지시합니다. Server.Transfer서버 요청을 줄이고 URL을 동일하게 유지하며 약간의 버그 bash를 통해 쿼리 문자열 및 양식 변수를 전송할 수 있습니다.

내가 발견하고 동의 한 것 ( source ) :

Server.Transfer와 같은 문장으로 다른 페이지로 사용자를 보낸다는 점에서 비슷 Server.Transfer("WebForm2.aspx")합니다. 그러나이 진술에는 여러 가지 장점과 단점이 있습니다.

첫째,를 사용하여 다른 페이지로 전송하면 Server.Transfer 서버 리소스가 절약됩니다. 브라우저가 리디렉션하도록 지시하는 대신 웹 서버의 "포커스"를 변경하고 요청을 전송합니다. 즉, HTTP 요청이 많이 발생하지 않으므로 웹 서버에 대한 부담이 줄어들고 응용 프로그램이 더 빨리 실행됩니다.

그러나 "전송"프로세스는 서버에서 실행되는 사이트에서만 작동 할 수 있기 때문에주의하십시오. Server.Transfer사용자를 외부 사이트로 보내는 데 사용할 수 없습니다 . 만 Response.Redirect그렇게 할 수 있습니다.

둘째, Server.Transfer브라우저에서 원래 URL을 유지합니다. 이는 디버깅시 혼란을 줄 수 있지만 데이터 입력 기술을 간소화하는 데 실제로 도움이 될 수 있습니다.

그게 다가 아닙니다 :이 Server.Transfer방법에는 두 번째 매개 변수 인 "preserveForm"도 있습니다. True와 같은 문을 사용하여 이를로 설정 Server.Transfer("WebForm2.aspx", True)하면 기존 쿼리 문자열 및 모든 양식 변수를 계속 전송중인 페이지에서 사용할 수 있습니다.

예를 들어 WebForm1.aspx에 TextBox1이라는 TextBox 컨트롤이 있고 preserveForm 매개 변수를 True로 설정하여 WebForm2.aspx로 전송 한 경우을 참조하여 원본 페이지 TextBox 컨트롤의 값을 검색 할 수 있습니다 Request.Form("TextBox1").


10
댓글 +1이지만 developer.com/net/asp/article.php/3299641 에서 그대로 복사 된 것 같습니다 . 다른 출처에서 온 경우에는이를 인용해야합니다.
Johnno Nolan

...하지만 그들은 당신을 인용해야 복사했습니다.
Johnno Nolan

7
나는 말했다 : 내가 찾은 것에 동의하고;
TStamper

6
소스에 연결하고 복사 된 부분에 대해 인용 형식 / 하이라이트를 사용해야합니다.
Chris W. Rea

1
어떻게 할 수 maintaining the original URL... ...really help streamline data entry techniques있습니까?
JohnB

36

Response.Redirect() 다음과 같은 경우에 사용해야합니다.

  • 요청을 서버의 일부 일반 HTML 페이지 나 다른 웹 서버로 리디렉션하려고합니다.
  • 우리는 각 요청마다 서버에 추가 왕복을 발생시키는 것에 신경 쓰지 않습니다.
  • 원래 요청에서 쿼리 문자열 및 양식 변수를 보존 할 필요는 없습니다.
  • 우리는 사용자가 브라우저에서 리디렉션 된 새로운 리디렉션 된 URL을보고 필요한 경우 북마크 할 수 있기를 원합니다.

Server.Transfer() 다음과 같은 경우에 사용해야합니다.

  • 현재 페이지 요청을 동일한 서버의 다른 .aspx 페이지로 전송하려고합니다.
  • 우리는 서버 자원을 보존하고 서버로의 불필요한 왕복을 피하고 싶습니다
  • 쿼리 문자열 및 양식 변수를 유지하려고합니다 (선택 사항)
  • 사용자 웹 브라우저에서 요청을 리디렉션 한 실제 URL을 표시 할 필요가 없습니다.

2
나에게 이것은 훨씬 더 명확하게 받아 들여지는 대답으로 좋습니다.
Baljeetsingh

28

Response.Redirect는 첫 페이지가 클라이언트에 도착한 페이지를 다른 페이지로 리디렉션합니다 . 따라서 클라이언트는 리디렉션을 알고 있습니다.

Server.Transfer는 페이지의 현재 실행을 종료합니다. 클라이언트가 리디렉션을 모릅니다. 쿼리 문자열과 양식 변수를 전송할 수 있습니다.

따라서 어느 것이 더 좋은지 선택해야 할 필요가 있습니다.


1
악의적 인 사용자 Response.Redirect가 전화를 걸었더라도 원본 페이지를로드하도록 바이 패스 할 수 있습니까 Response.Redirect?
northben

@northben-거의 모든 것이 타협 될 수 있기 때문에 기술과 관련하여 "아니오"라고 말하는 것은 결코 쉬운 일이 아닙니다. 그러나이 경우 어떻게 할 수 있습니까? 인생에서.
JonH

23

여기에 이미지 설명을 입력하십시오

"response.redirect"및 "server.transfer"는 페이지가 실행되는 동안 한 페이지에서 다른 페이지로 사용자를 전송하는 데 도움이됩니다. 그러나이 전송 / 리디렉션을 수행하는 방식은 매우 다릅니다.

당신이 시각적 인 사람이고 이론보다는 데모를보고 싶다면 아래의 페이스 북 비디오를 통해 더 분명한 차이점을 설명하는 것이 좋습니다.

https://www.facebook.com/photo.php?v=762186150488997

그들 사이의 주요 차이점은 누가 이전을 수행 하는가입니다. "response.redirect"에서는 브라우저가 전송을 수행하고 "server.transfer"는 서버가 전송을 수행합니다. 이 문장을 좀 더 자세하게 이해하려고 노력하겠습니다.

"Server.Transfer"에서 다음은 전송이 수행되는 순서입니다.

1. 사용자는 ASP.NET 페이지로 요청을 보냅니다. 아래 그림에서 요청은 "WebForm1"로 보내지고 "Webform2"로 이동하고 싶습니다.

2. 서버가 "Webform1"실행을 시작하고 페이지 수명주기가 시작됩니다. 그러나 페이지의 전체 수명주기가 완료되기 전에 "WebForm2"에 "Server.transfer"가 발생합니다.

3. "Webform2"페이지 개체가 생성되고 전체 페이지 수명주기가 실행 된 다음 출력 HTML 응답이 브라우저로 전송됩니다.

여기에 이미지 설명을 입력하십시오

"Response.Redirect"에있는 동안 다음은 탐색을위한 일련의 이벤트입니다.

1. 클라이언트 (브라우저)가 페이지에 요청을 보냅니다. 아래 그림에서 요청은 "WebForm1"로 보내지고 "Webform2"로 이동하고 싶습니다.

2. "Webform1"의 라이프 사이클이 시작됩니다. 그러나 라이프 사이클 사이에 "Response.Redirect"가 발생합니다.

3. 이제 서버가 리디렉션을 수행하는 대신 브라우저에 HTTP 302 명령을 보냅니다. 이 명령은 브라우저에 "Webform2.aspx"페이지에 GET 요청을 시작해야 함을 알려줍니다.

4. 브라우저는 302 명령을 해석하고 "Webform2.aspx"에 대한 GET 요청을 보냅니다.

여기에 이미지 설명을 입력하십시오

즉, "Server.Transfer"는 서버에서 실행되고 "Response.Redirect"는 브라우저에서 실행됩니다. "Response.Redirect"는 페이지를 리디렉션하기 위해 두 가지 요청이 필요합니다.

"Server.Transfer"를 사용할 때와 "Response.Redirect"를 사용할 때?

같은 서버에있는 페이지를 탐색하려면 "Server.Transfer"를 사용하고 다른 서버와 도메인에있는 페이지를 탐색하려면 "Response.Redirect"를 사용하십시오.

여기에 이미지 설명을 입력하십시오

다음은 차이점과 사용 시나리오를 요약 한 표입니다.

여기에 이미지 설명을 입력하십시오


Server.Transfer 및 Response.Redirect를 사용하는 데 문제가있을 때 유용 stackoverflow.com/questions/1433448/thread-was-being-aborted
Kiquenet

의 경우 Server.Transfer: 동일한 서버 또는 동일한 IIS 웹 사이트 ?
Kiquenet

당신 때문에 내 편집에 필요한 최소한 6 개 문자의 다음 단락을 업데이트하십시오 수 없습니다 : "Response.Redirect를이"에 의해 실행되는 동안 즉 "Server.Transfer를"이 서버에서 실행되는 THR 브라우저. "Response.Redirect" 는 페이지를 리디렉션하기 위해 두 가지 요청이 필요합니다.
paul cheung

11

Server.Transfer의 아름다움은 당신이 할 수있는 일입니다.

TextBox myTxt = (TextBox)this.Page.PreviousPage.FindControl("TextBoxID");

Response.Redirect가 아닌 Server.Transfer를 사용하는 한 위의 방법을 사용하여 이전 페이지에서 무엇이든 얻을 수 있습니다.


10

ScarletGarden의 의견 외에도 검색 엔진 및 리디렉션의 영향을 고려해야합니다. 이 페이지가 영구적으로 이동 했습니까? 일시적으로? 차이가 있습니다.

참조 : Response.Redirect와 "301 영구 이동" :

우리는 모두 한 번에 Response.Redirect를 사용했습니다. 방문자가 어떻게 든 잘못된 장소에 오면 올바른 방향을 가리 키도록하는 빠르고 쉬운 방법입니다. 그러나 실제로 "301 Moved Permanently"를 보내려고 할 때 Response.Redirect가 "302 Found"라는 HTTP 응답 상태 코드를 전송한다는 것을 알고 있습니까?

차이는 작게 보이지만 실제로는 실제로 큰 차이를 만들 수 있습니다. 예를 들어 "301 Moved Permanently"응답 코드를 사용하는 경우 대부분의 검색 엔진은 인덱스에서 오래된 링크를 제거하고 새 링크로 바꿉니다. "302 Found"를 사용하면 계속 이전 페이지로 돌아갑니다 ...


링크가 작동하지 않습니다. 대신 이 web.archive.org 링크 를 사용하십시오 .
stomy

6

전송은 전적으로 서버 측입니다. 클라이언트 주소 표시 줄은 일정하게 유지됩니다. 요청 간의 컨텍스트 전송에 대한 약간의 복잡성 페이지 핸들러 플러시 및 재시작은 비용이 많이들 수 있으므로 BeginRequest 중 HttpModule과 같이 파이프 라인에서 초기에 전송을 수행하십시오. MSDN 문서를주의 깊게 읽고 특히 포스트 백 시나리오에서 HttpContext.Request의 새로운 값을 테스트하고 이해하십시오. 우리는 일반적으로 오류 시나리오에 Server.Transfer를 사용합니다.

리디렉션은 302 상태로 요청을 종료하고 클라이언트 측 왕복 응답으로 예외를 처리하고 내부적으로 예외를 처리합니다 (사소한 서버 성능 저하-하루에 얼마나 많은 작업을 수행하는지에 따라 다름). 클라이언트는 새 주소로 이동합니다. 브라우저 주소 표시 줄 및 기록 업데이트 등. 고객은 추가 왕복 비용을 지불합니다. 비용은 대기 시간에 따라 다릅니다. 우리의 사업에서 우리는 리디렉션 많은 우리가 예외 비용을 피하기 위해 우리 자신의 모듈을 작성합니다.


6

위에서 지정한대로 많은 차이점이 있습니다. 무엇보다도 차이점이 하나 더 있습니다. Response.Redirect()응용 프로그램의 일부가 아닌 응용 프로그램 Server.Transfer()내에서 사용자를 리디렉션하는 데만 사용할 수 있는 모든 페이지로 사용자를 리디렉션하는 데 사용할 수 있습니다 .

//This will work.
Response.Redirect("http://www.google.com");

//This will not work.
Server.Transfer("http://www.google.com");

5

Response.Redirect는 어디로 가야하는지 파악하기 위해 서버에 추가 트립을 추가하므로 비용이 많이 듭니다.

Server.Transfer가 더 효율적이지만 Url이 실제로 변경되지 않기 때문에 사용자에게 약간 오해의 소지가 있습니다.

내 경험상 성능의 차이는 후자의 접근법을 사용하기에 충분하지 않았습니다.


4

Server.Transfer는 클라이언트 브라우저에서 URL을 변경하지 않으므로 브라우저는 다른 서버 측 처리기로 변경 한 사실을 효과적으로 알지 못합니다. Response.Redirect는 브라우저에 다른 페이지로 이동하도록 지시하므로 제목 표시 줄의 URL이 변경됩니다.

Server.Transfer는 서버로 한 번의 왕복을 피하기 때문에 약간 더 빠르지 만, URL을 변경하지 않으면 수행하려는 작업에 따라 좋지 않을 수 있습니다.


4

Response.Redirect : 요청한 페이지를 새 위치에서 찾을 수 있음을 브라우저에 알려줍니다. 그런 다음 브라우저는 새 페이지에 대한 다른 요청을 시작하여 브라우저에 내용을로드합니다. 브라우저에서 두 가지 요청이 발생합니다.

Server.Transfer : 서버의 첫 번째 페이지에서 두 번째 페이지로 실행을 전송합니다. 브라우저 클라이언트에 관한 한, 하나의 요청을하고 초기 페이지는 컨텐츠로 응답하는 페이지입니다. 이 방법의 장점은 클라이언트 브라우저에서 서버로의 왕복이 한 번 덜 발생한다는 것입니다. 또한 게시 된 양식 변수 및 쿼리 문자열 매개 변수도 두 번째 페이지에서 사용할 수 있습니다.


3

Transfer ()에 대한 자세한 내용은 실제로 Server.Execute () + Response.End ()이며 소스 코드는 다음과 같습니다 (Mono / .net 4.0부터).

public void Transfer (string path, bool preserveForm)
{
    this.Execute (path, null, preserveForm, true);
    this.context.Response.End ();
}

Execute ()의 경우 실행할 경로는 주어진 경로 의 핸들러 입니다.

ASP.NET은 현재 사용자에게 Execute 메서드가 제공 한 리소스를 볼 수있는 권한이 있는지 확인하지 않습니다 . ASP.NET 권한 부여 및 인증 논리는 원래 리소스 처리기가 호출되기 전에 실행되지만 ASP.NET은 Execute 메서드가 나타내는 처리기를 직접 호출 하고 새 리소스에 대한 인증 및 권한 부여 논리를 다시 실행 하지 않습니다. 응용 프로그램의 보안 정책에 따라 클라이언트가 리소스에 액세스 할 수있는 적절한 권한을 부여해야하는 경우 응용 프로그램은 재 인증을 강제 실행하거나 사용자 지정 액세스 제어 메커니즘을 제공해야합니다.

다음을 사용하여 재 인증을 강제 할 수 있습니다. Execute 메소드 대신 Redirect 메소드를 . 리디렉션 은 브라우저가 새 리소스를 요청하는 클라이언트 쪽 리디렉션을 수행합니다. 이 리디렉션은 시스템에 들어오는 새로운 요청이므로 인터넷 정보 서비스 (IIS) 및 ASP.NET 보안 정책 모두의 모든 인증 및 권한 부여 논리에 적용됩니다.

- MSDN에서


2

Response.Redirect는 추가 왕복 여행을 포함하고 주소 표시 줄을 업데이트합니다.

Server.Transfer는 주소 표시 줄을 변경하지 않으며 서버는 다른 페이지의 내용으로 요청에 응답합니다.

예 :

Response.Redirect :-

  1. 클라이언트에서 브라우저는 http : //InitiallyRequestedPage.aspx 페이지를 요청합니다 .
  2. 서버에서 302가 리디렉션 주소 http : //AnotherPage.aspx를 전달하여 요청에 응답합니다 .
  3. 클라이언트에서 브라우저는 http : //AnotherPage.aspx 주소로 두 번째 요청을합니다 .
  4. 서버에서 http : //AnotherPage.aspx의 내용으로 응답합니다 .

서버. 전송 :-

  1. 클라이언트 브라우저에서 http : //InitiallyRequestedPage.aspx 페이지를 요청합니다 .
  2. 서버 서버에서 http : //AnotherPage.aspx로 이동
  3. 서버에서 http : //InitiallyRequestedPage.aspx에 대한 요청에 대한 응답이 http : //AnotherPage.aspx 에서 콘텐츠를 다시 전달합니다 .

응답. 리디렉션

장점 : -RESTful-주소 표시 줄을 변경하고 주소는 요청 사이의 상태 변경을 기록하는 데 사용할 수 있습니다.

단점 :- 느림-클라이언트와 서버 사이에 추가 왕복이 있습니다. 클라이언트와 서버간에 상당한 대기 시간이있는 경우 비용이 많이들 수 있습니다.

서버. 전송

장점 :- 빠르다.

단점 : -상태 손실-Server.Transfer를 사용하여 다시 게시에 대한 응답으로 응용 프로그램의 상태를 변경하는 경우 페이지가 다시로드되면 해당 상태가 손실됩니다. 주소 표시 줄은 원래 상태와 같습니다. 첫 번째 요청에서.


0

Response.Redirect Response.Redirect ()는 새 페이지로 이동하여 주소 표시 줄을 업데이트 한 후 브라우저 기록에 추가합니다. 브라우저에서 뒤로를 클릭 할 수 있습니다. 요청을 서버의 일부 일반 HTML 페이지 나 다른 웹 서버로 리디렉션합니다. 각 요청마다 서버에 추가 왕복이 발생합니다. 원래 요청에서 쿼리 문자열 및 양식 변수를 유지하지 않습니다. 브라우저에서 리디렉션 된 새로운 리디렉션 된 URL을 볼 수 있으며 필요한 경우 북마크 할 수 있습니다. 응답. 리디렉션은 단순히 (HTTP 302) 브라우저로 메시지를 보냅니다.

Server.Transfer Server.Transfer ()는 주소 표시 줄을 변경하지 않으므로 되돌릴 수 없습니다. 사용자가 어디로 가고 있는지 확인하지 않으려면 Server.Transfer ()를 사용해야합니다. 언젠가 "로드 중"유형 페이지에 있습니다. 현재 페이지 요청을 동일한 서버의 다른 .aspx 페이지로 전송합니다. 서버 자원을 보존하고 서버로의 불필요한 왕복을 피합니다. 쿼리 문자열 및 양식 변수를 유지합니다 (선택 사항). 사용자 웹 브라우저에서 요청을 리디렉션하는 실제 URL은 표시하지 않습니다. Server.Transfer는 브라우저가 아무것도 몰라도 브라우저가 페이지를 요청하지만 서버는 다른 내용을 반환합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.