Вызывая метод Response.Redirect, сервер отсылает клиентскому браузеру HTTP header со статус-кодом (302), который означает, что обьект был перемещён. Так же в заголовке указывается новое место обьекта. Смотрим, что получается после вызова Response.Redirect("~/Default.aspx"):
[code=xml]
HTTP/1.1 302 Found
Server: ASP.NET Development Server/9.0.0.0
Date: Thu, 04 Sep 2008 11:59:21 GMT
X-AspNet-Version: 2.0.50727
Location: /Default.aspx
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Length: 130
Connection: Close
<html><head><title>Object moved</title></head><body>
<h2>Object moved to <a href="/Default.aspx">here</a>.</h2>
</body></html>
[/code]
Если клиентский браузер нормально воспринимает перенаправления, то такой страницы вы не увидите. Браузер автоматически запросит ресурс по указанном Location.
На заметку
1. В том случае, когда первоначальный запрос был вызван POST-методом, после перенаправления методом Response.Redirect на другую страницу теряются все данные формы.
2. Благодаря же тому, что браузер посылает второй запрос, его возможно перенаправить на внешний ресурс.
Теперь пару слов о Server.Transfer. В отличии от Response.Redirect данный метод перенаправляет выполнение с одной страницы на другую на сервере. Это хорошо проявляется, если посмотреть на Url, после перенаправления. Он такой же как и в первом запросе. Более подробно на примере:
Браузер запрашивает страницу http://localhost:4107/Default.aspx. Метод Page_Load страницы выглядит так [code=csharp]protected void Page_Load(object sender, EventArgs e)
{
Server.Transfer("~/Foo.aspx");
} [/code]
Смотрим на Url, он остался таким же (http://localhost:4107/Default.aspx), но в браузере отображена страница Foo.aspx.
Ещё одним замечальным свойством Server.Transfer является то, что он позволяет передавать второй странице данные формы и строки запроса первой. Если же такие данные на второй странице не нужны, можно почистить их передав вторым параметром false. Пример: [code=csharp]
Server.Transfer("~/Foo.aspx", false); [/code]
На заметку
1. Если первая страница записывает что-то в буфер ответа (Response), то перед вызовом Server.Transfer Response нужно почистить, иначе получится каша: содержимое второй страницы добавится после содержимого первой страницы.
2. Так Server.Transfer выполняется на сервере, невозможно перенаправить запрос на внешний сайт.