Server.Transfer vs. Response.Redirect

263

Qual é a diferença entre Server.Transfere Response.Redirect?

  • Quais são as vantagens e desvantagens de cada um?
  • Quando é apropriado um sobre o outro?
  • Quando alguém não é apropriado?
kedar kamthe
fonte
3
As vantagens e desvantagens foram declaradas no site abaixo. developer.com/net/asp/article.php/3299641 Um ponto interessante no artigo é que o Server.Transfer consome mais energia do servidor em comparação com o Server.Redirect.
Ray Lu
Server.Transfer reduz solicitações de página, então suponho que seja "melhor" nesse sentido. No entanto, o Response.Redirect pode enviar o usuário para um site externo, enquanto o Server.Transfer não pode.
codeConcussion
1
Se você estiver executando no modo integrado do IIS 7, considere usar em Server.TransferRequestvez de Server.Transfer.
Hackeado
O @Haacked deveria ter lido que, no começo, Server.TransferRequest resolveu meus problemas com a matriz da web e o iis7. Gracias. Eles deveriam colocar isso aqui em cima.
Jason Sebring

Respostas:

234

Response.Redirectsimplesmente envia uma mensagem (HTTP 302) para o navegador.

Server.Transfer acontece sem o navegador saber nada, o navegador solicita uma página, mas o servidor retorna o conteúdo de outra.

CMS
fonte
Isso funciona com páginas CSHTML com matriz da web? Não consigo fazê-lo funcionar ao executar um Server.Transfer para uma página CSHTML como Server.Transfer ("~ / somepage.cshtml", true), mas parece funcionar para outros tipos de páginas. Sim, tenho o barbeador instalado e as páginas funcionam conforme o esperado.
Jason Sebring
11
Ei, descobri. Você precisa usar Server.TransferRequest para páginas de matriz da web cshtml.
Jason Sebring
Server.Transfer () transfere apenas para páginas físicas? por exemplo. se eu transferir para Server.Transfer ("default / category1.aspx"), é necessário ter uma pasta padrão e uma página aspx category1 nela?
Ihimv
95

Response.Redirect()enviará você para uma nova página, atualize a barra de endereço e adicione-a ao histórico do navegador. No seu navegador, você pode clicar em voltar.

Server.Transfer()não altera a barra de endereço. Você não pode revidar.

Uso Server.Transfer()quando não quero que o usuário veja para onde estou indo. Às vezes, em uma página do tipo "carregando".

Caso contrário, eu sempre vou usar Response.Redirect().

Christian Payne
fonte
75

Para ser breve: Response.Redirectbasta dizer ao navegador para visitar outra página. Server.Transferajuda a reduzir as solicitações do servidor, mantém a URL a mesma e, com um pouco de correção de erros, permite transferir a string de consulta e as variáveis ​​de formulário.

Algo que eu encontrei e concordo ( fonte ):

Server.Transferé semelhante, pois envia o usuário para outra página com uma instrução como Server.Transfer("WebForm2.aspx"). No entanto, a declaração tem várias vantagens e desvantagens distintas.

Em primeiro lugar, a transferência para outra página usando Server.Transfer economiza recursos do servidor. Em vez de dizer ao navegador para redirecionar, ele simplesmente altera o "foco" no servidor da Web e transfere a solicitação. Isso significa que você não recebe tantas solicitações HTTP, o que facilita a pressão no servidor da Web e faz com que seus aplicativos sejam executados mais rapidamente.

Mas cuidado: porque o processo de "transferência" pode funcionar apenas nos sites em execução no servidor; você não pode usar Server.Transferpara enviar o usuário para um site externo. Só Response.Redirectpode fazer isso.

Em segundo lugar, Server.Transfermantém o URL original no navegador. Isso pode realmente ajudar a simplificar as técnicas de entrada de dados, embora possa causar confusão durante a depuração.

Isso não é tudo: o Server.Transfermétodo também possui um segundo parâmetro - "preserveForm". Se você definir isso como True, usando uma instrução como Server.Transfer("WebForm2.aspx", True), a sequência de consultas existente e quaisquer variáveis ​​de formulário ainda estarão disponíveis para a página para a qual você está transferindo.

Por exemplo, se o seu WebForm1.aspx tiver um controle TextBox chamado TextBox1 e você transferir para o WebForm2.aspx com o parâmetro preserveForm definido como True, você poderá recuperar o valor do controle TextBox da página original fazendo referência Request.Form("TextBox1").

TStamper
fonte
10
+1 para comentar, mas isso parece copiado literalmente em developer.com/net/asp/article.php/3299641 . Se for de outra fonte, você deve citá-lo.
31909 Johnno Nolan
... mas eles copiaram eles deveriam citar você.
31910 Johnno Nolan
7
Eu disse: algo que encontrei e concordo;
TSTamper
6
Deve vincular à fonte e usar formatação / destaque de cotação para as partes copiadas.
Chris W. Rea
1
Como pode maintaining the original URL... ...really help streamline data entry techniques?
JohnB
36

Response.Redirect() deve ser usado quando:

  • queremos redirecionar a solicitação para algumas páginas HTML simples em nosso servidor ou para outro servidor Web
  • não nos importamos em causar ida e volta ao servidor em cada solicitação
  • não precisamos preservar as variáveis ​​de formulário e sequência de consultas da solicitação original
  • queremos que nossos usuários vejam o novo URL redirecionado para onde ele é redirecionado em seu navegador (e, se necessário), adicione aos favoritos.

Server.Transfer() deve ser usado quando:

  • queremos transferir a solicitação de página atual para outra página .aspx no mesmo servidor
  • queremos preservar os recursos do servidor e evitar as viagens de ida e volta desnecessárias para o servidor
  • queremos preservar as variáveis ​​de sequência e formulário de consulta (opcionalmente)
  • não precisamos mostrar o URL real para o qual redirecionamos a solicitação no navegador da web dos usuários
SoftDev
fonte
2
Muito mais claro, para mim isso é melhor como resposta aceita.
Baljeetsingh
28

O Response.Redirect redireciona a página para outra página após a primeira página chegar ao cliente. Então, o cliente conhece o redirecionamento.

Server.Transfer encerra a execução atual da página. O cliente não conhece o redirecionamento. Permite transferir a sequência de caracteres de consulta e as variáveis ​​de formulário.

Portanto, depende de suas necessidades para escolher qual é o melhor.

Canavar
fonte
1
Um usuário mal-intencionado pode ignorar Response.Redirectpara carregar a página original mesmo que eu tenha ligado Response.Redirect?
northben
@northben - nunca é fácil dizer "não" quando se trata de tecnologia, pois quase tudo pode ser comprometido - mas, neste caso, como eles poderiam - eu diria que não, não podiam ... mas já me provaram errado muitas vezes Em vida.
21916 JonH
23

insira a descrição da imagem aqui

"response.redirect" e "server.transfer" ajudam a transferir o usuário de uma página para outra enquanto a página estiver em execução. Mas a maneira como eles fazem essa transferência / redirecionamento é muito diferente.

Caso você seja um cara visual e gostaria de ver mais uma demonstração do que uma teoria, sugiro ver o vídeo do facebook abaixo, que explica a diferença de uma maneira mais demonstrativa.

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

A principal diferença entre eles é quem faz a transferência. Em "response.redirect", a transferência é feita pelo navegador, enquanto em "server.transfer", é feita pelo servidor. Vamos tentar entender essa afirmação de maneira mais detalhada.

Em "Server.Transfer", a seguir está a sequência de como a transferência acontece: -

1.O usuário envia uma solicitação para uma página ASP.NET. Na figura abaixo, a solicitação é enviada para "WebForm1" e gostaríamos de navegar para "Webform2".

2.O servidor começa a executar "Webform1" e o ciclo de vida da página é iniciado. Mas antes que o ciclo de vida completo da página seja concluído, "Server.transfer" acontece com "WebForm2".

3. O objeto de página "Webform2" é criado, o ciclo de vida da página inteira é executado e a resposta HTML de saída é enviada ao navegador.

insira a descrição da imagem aqui

Enquanto em "Response.Redirect", a seguir está a sequência de eventos para navegação: -

1.O cliente (navegador) envia uma solicitação para uma página. Na figura abaixo, a solicitação é enviada para "WebForm1" e gostaríamos de navegar para "Webform2".

2.O ciclo de vida de "Webform1" começa a executar. Mas no meio do ciclo de vida "Response.Redirect" acontece.

3. Agora, em vez de o servidor fazer um redirecionamento, ele envia um comando HTTP 302 para o navegador. Este comando informa ao navegador que ele precisa iniciar uma solicitação GET para a página "Webform2.aspx".

4.Browser interpreta o comando 302 e envia uma solicitação GET para "Webform2.aspx".

insira a descrição da imagem aqui

Em outras palavras, "Server.Transfer" é executado pelo servidor enquanto "Response.Redirect" é executado pelo navegador thr. "Response.Redirect" precisa de duas solicitações para fazer um redirecionamento da página.

Então, quando usar "Server.Transfer" e quando usar "Response.Redirect"?

Use "Server.Transfer" quando desejar navegar em páginas que residem no mesmo servidor, use "Response.Redirect" quando desejar navegar entre páginas que residem em outro servidor e domínio.

insira a descrição da imagem aqui

Abaixo está uma tabela resumida da qual destaca as diferenças e em qual cenário usar.

insira a descrição da imagem aqui

Shivprasad Koirala
fonte
Quando os problemas úteis usando Server.Transfer e Response.Redirect stackoverflow.com/questions/1433448/thread-was-being-aborted
Kiquenet
Para Server.Transfer: o mesmo servidor ou o mesmo site do IIS ?
Kiquenet
Você poderia atualizar o parágrafo a seguir devido a pelo menos 6 caracteres necessários para minha edição: Em outras palavras, "Server.Transfer" é executado pelo servidor enquanto "Response.Redirect" é executado pelo thr browser. "Response.Redirect" precisa de duas solicitações para fazer um redirecionamento da página.
paul cheung
11

A beleza do Server.Transfer é o que você pode fazer com ele:

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

Você pode obter qualquer coisa da sua página anterior usando o método acima, desde que use Server.Transfer, mas não Response.Redirect

Margulies de Israel
fonte
10

Além do comentário de ScarletGarden, você também precisa considerar o impacto dos mecanismos de pesquisa e seu redirecionamento. Esta página mudou permanentemente? Temporariamente? Faz diferença.

consulte: Response.Redirect vs. "301 movido permanentemente" :

Todos nós usamos o Response.Redirect uma vez ou outra. É a maneira rápida e fácil de fazer com que os visitantes apontem na direção certa se, de alguma forma, acabarem no lugar errado. Mas você sabia que o Response.Redirect envia um código de status de resposta HTTP "302 encontrado" quando você realmente deseja enviar "301 movido permanentemente"?

A distinção parece pequena, mas em certos casos pode realmente fazer uma grande diferença. Por exemplo, se você usar um código de resposta "301 movido permanentemente", a maioria dos mecanismos de pesquisa removerá o link desatualizado de seu índice e o substituirá pelo novo. Se você usar "302 encontrado", eles continuarão retornando à página antiga ...

Diodeus - James MacFarlane
fonte
O link não funciona. Use este link web.archive.org .
Stom
6

A transferência é totalmente do lado do servidor. A barra de endereço do cliente permanece constante. Alguma complexidade sobre a transferência de contexto entre solicitações. Liberar e reiniciar manipuladores de página pode ser caro, assim como sua transferência no início do pipeline, por exemplo, em um HttpModule durante BeginRequest. Leia os documentos do MSDN com atenção, teste e compreenda os novos valores do HttpContext.Request - especialmente em cenários de postagem. Geralmente usamos Server.Transfer para cenários de erro.

O redirecionamento finaliza a solicitação com um status 302 e uma resposta de ida e volta do lado do cliente e recebe internamente uma exceção (desempenho menor do servidor - depende de quantas vezes você faz por dia) O Cliente navega para o novo endereço. Barra de endereços do navegador e atualizações do histórico etc. O cliente paga o custo de uma ida e volta extra - o custo varia dependendo da latência. Em nossos negócios, redirecionamos muito , escrevemos nosso próprio módulo para evitar o custo da exceção.

stephbu
fonte
6

Existem muitas diferenças, conforme especificado acima. Além de acima de tudo, há mais uma diferença. Response.Redirect()pode ser usado para redirecionar o usuário para qualquer página que não faça parte do aplicativo, mas Server.Transfer()só pode ser usada para redirecionar o usuário dentro do aplicativo.

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

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

O Response.Redirect é mais caro, pois adiciona uma viagem extra ao servidor para descobrir para onde ir.

Server.Transfer é mais eficiente, no entanto, pode levar um pouco de erro ao usuário, pois o URL não muda fisicamente.

Na minha experiência, a diferença de desempenho não foi significativa o suficiente para usar a última abordagem

deadbug
fonte
4

Server.Transfer não altera a URL no navegador do cliente; portanto, o navegador não sabe que você mudou para outro manipulador do lado do servidor. Response.Redirect diz ao navegador para ir para uma página diferente, para que o URL na barra de título mude.

Server.Transfer é um pouco mais rápido, pois evita uma ida e volta ao servidor, mas a não alteração de URL pode ser boa ou ruim para você, dependendo do que você está tentando fazer.

krosenvold
fonte
4

Response.Redirect: informa ao navegador que a página solicitada pode ser encontrada em um novo local. O navegador inicia outra solicitação para a nova página carregando seu conteúdo no navegador. Isso resulta em duas solicitações do navegador.

Server.Transfer: Transfere a execução da primeira página para a segunda página no servidor. No que diz respeito ao cliente do navegador, ele fez uma solicitação e a página inicial é a que responde ao conteúdo. O benefício dessa abordagem é menos uma ida e volta ao servidor a partir do navegador do cliente. Além disso, quaisquer variáveis ​​de formulário publicadas e parâmetros de sequência de consulta também estão disponíveis na segunda página.

Nick Kahn
fonte
3

Apenas mais detalhes sobre Transfer (), na verdade é Server.Execute () + Response.End (), seu código-fonte está abaixo (de Mono / .net 4.0):

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

e para Execute (), o que é executar é o manipulador do caminho especificado, consulte

O ASP.NET não verifica se o usuário atual está autorizado a exibir o recurso entregue pelo método Execute . Embora a lógica de autorização e autenticação do ASP.NET seja executada antes que o manipulador de recursos original seja chamado, o ASP.NET chama diretamente o manipulador indicado pelo método Execute e não executa novamente a lógica de autenticação e autorização para o novo recurso. Se a política de segurança do seu aplicativo exigir que os clientes tenham autorização apropriada para acessar o recurso, o aplicativo deverá forçar a nova autorização ou fornecer um mecanismo personalizado de controle de acesso.

Você pode forçar uma nova autorização usando o método Redirect em vez do método Execute . Redirecionar executa um redirecionamento do lado do cliente no qual o navegador solicita o novo recurso. Como esse redirecionamento é uma nova solicitação que entra no sistema, está sujeito a toda a lógica de autenticação e autorização das políticas de segurança dos Serviços de Informações da Internet (IIS) e do ASP.NET.

- do MSDN

rockXrock
fonte
2

O Response.Redirect envolve uma viagem de ida e volta extra e atualiza a barra de endereço.

Server.Transfer não faz com que a barra de endereço seja alterada, o servidor responde à solicitação com conteúdo de outra página

por exemplo

Resposta: Redirecionado: -

  1. No cliente, o navegador solicita uma página http: //InitiallyRequestedPage.aspx
  2. No servidor, responde à solicitação com 302 passando o endereço de redirecionamento http: //AnotherPage.aspx .
  3. No cliente, o navegador faz uma segunda solicitação para o endereço http: //AnotherPage.aspx .
  4. No servidor, responde com o conteúdo de http: //AnotherPage.aspx

Server.Transfer: -

  1. No navegador do cliente solicita uma página http: //InitiallyRequestedPage.aspx
  2. No servidor Server.Transfer para http: //AnotherPage.aspx
  3. No servidor, a resposta é feita à solicitação de http: //InitiallyRequestedPage.aspx retornando o conteúdo de http: //AnotherPage.aspx

Response.Redirect

Prós: - RESTful - Altera a barra de endereço, o endereço pode ser usado para registrar alterações de estado entre solicitações.

Contras: - Lento - Há uma viagem de ida e volta extra entre o cliente e o servidor. Isso pode ser caro quando há uma latência substancial entre o cliente e o servidor.

Server.Transfer

Prós: - Rápido.

Contras: - Estado perdido - Se você estiver usando Server.Transfer para alterar o estado do aplicativo em resposta às postagens, se a página for recarregada, esse estado será perdido, pois a barra de endereço será a mesma de antes. no primeiro pedido.

Mick
fonte
0

Response.Redirect Response.Redirect () o envia para uma nova página, atualiza a barra de endereços e a adiciona ao Histórico do Navegador. No seu navegador, você pode clicar em voltar. Ele redireciona a solicitação para algumas páginas HTML simples em nosso servidor ou para outro servidor web. Causa ida e volta adicionais ao servidor em cada solicitação. Ele não preserva as variáveis ​​de seqüência de caracteres e formulário da consulta da solicitação original. Ele permite ver o novo URL redirecionado para onde ele é redirecionado no navegador (e pode marcar como favorito, se necessário). Resposta. Redirecionar simplesmente envia uma mensagem para o navegador (HTTP 302).

Server.Transfer Server.Transfer () não altera a barra de endereço, não podemos revidar. Deve-se usar Server.Transfer () quando ele / ela não deseja que o usuário veja para onde está indo. Em algum momento em uma página do tipo "carregando". Ele transfere a solicitação de página atual para outra página .aspx no mesmo servidor. Ele preserva os recursos do servidor e evita as viagens de ida e volta desnecessárias para o servidor. Ele preserva as variáveis ​​de sequência e forma de consulta (opcionalmente). Ele não mostra a URL real onde redireciona a solicitação no Navegador da Web dos usuários. Server.Transfer acontece sem que o navegador saiba nada, o navegador solicita uma página, mas o servidor retorna o conteúdo de outra.

Shailendra Mishra
fonte