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?

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.


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().


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").


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

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.


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


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


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 ...


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.


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");

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


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.


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.


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


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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.