Máy chủ.Transfer Vs. Phản hồi


263

Sự khác biệt giữa Server.Transfervà là Response.Redirectgì?

  • Ưu điểm và nhược điểm của mỗi là gì?
  • Khi nào thì thích hợp hơn cái kia?
  • Khi nào thì không phù hợp?

3
Những lợi thế và bất lợi đã được nêu trong các trang web dưới đây. developer.com/net/asp/article.php/3299641 Một điểm thú vị trong bài viết là Server.Transfer tiêu thụ nhiều năng lượng máy chủ hơn so với Server.Redirect.
Ray Lu

Server.Transfer giảm yêu cầu trang, vì vậy tôi cho rằng nó "tốt hơn" trong khía cạnh đó. Tuy nhiên, Feedback.Redirect có thể gửi người dùng đến một trang bên ngoài trong khi Server.Transfer không thể.
codeConcussion

1
Nếu bạn đang chạy trên chế độ Tích hợp IIS 7, bạn có thể cân nhắc sử dụng Server.TransferRequestthay vì Server.Transfer.
Haacked

@Haacked nên đọc rằng ngay từ đầu, Server.TransferRequest đã giải quyết vấn đề của tôi về ma trận web và iis7. Gracias. Họ nên đặt nó lên đây.
Jason Sebring

Câu trả lời:


234

Response.Redirectchỉ cần gửi tin nhắn (HTTP 302) xuống trình duyệt.

Server.Transfer xảy ra mà trình duyệt không biết gì, trình duyệt yêu cầu một trang, nhưng máy chủ trả về nội dung của trang khác.


Điều này có hoạt động với các trang CSHTML với ma trận web không? Tôi dường như không thể làm cho nó hoạt động khi thực hiện Server.Transfer đến trang CSHTML như Server.Transfer ("~ / somepage.cshtml", đúng) nhưng dường như hoạt động cho các loại trang khác. Có, tôi đã cài đặt dao cạo và các trang hoạt động như mong đợi.
Jason Sebring

11
Này phát hiện ra. Bạn phải sử dụng Server.TransferRequest cho các trang ma trận web cshtml.
Jason Sebring

Server.Transfer () chỉ chuyển đến các trang vật lý? ví dụ nếu tôi chuyển sang Server.Transfer ("default / category1.aspx") thì nó có được yêu cầu để có một thư mục mặc định và một danh mục1, trang aspx không?
ihimv

95

Response.Redirect()sẽ đưa bạn đến một trang mới, cập nhật thanh địa chỉ và thêm nó vào Lịch sử trình duyệt. Trên trình duyệt của bạn, bạn có thể nhấp lại.

Server.Transfer()không thay đổi thanh địa chỉ. Bạn không thể đánh trả.

Tôi sử dụng Server.Transfer()khi tôi không muốn người dùng thấy nơi tôi sẽ đến. Đôi khi trên một trang loại "tải".

Nếu không tôi sẽ luôn luôn sử dụng Response.Redirect().


75

To Short: Response.Redirectchỉ cần yêu cầu trình duyệt truy cập một trang khác. Server.Transfergiúp giảm các yêu cầu máy chủ, giữ cho URL giống nhau và, với một chút lỗi, cho phép bạn chuyển chuỗi truy vấn và biến biểu mẫu.

Một cái gì đó tôi tìm thấy và đồng ý với ( nguồn ):

Server.Transfertương tự ở chỗ nó sẽ gửi người dùng đến một trang khác với một câu lệnh như Server.Transfer("WebForm2.aspx"). Tuy nhiên, tuyên bố có một số lợi thế và bất lợi riêng biệt.

Đầu tiên, chuyển sang một trang khác bằng cách sử dụng Server.Transfer tài nguyên máy chủ bảo tồn. Thay vì yêu cầu trình duyệt chuyển hướng, nó chỉ cần thay đổi "tiêu điểm" trên máy chủ Web và chuyển yêu cầu. Điều này có nghĩa là bạn không nhận được khá nhiều yêu cầu HTTP đến, do đó giảm bớt áp lực cho máy chủ Web của bạn và làm cho các ứng dụng của bạn chạy nhanh hơn.

Nhưng xem ra: bởi vì quá trình "chuyển" chỉ có thể hoạt động trên các trang web đang chạy trên máy chủ; bạn không thể sử dụng Server.Transferđể gửi người dùng đến một trang web bên ngoài. Chỉ Response.Redirectcó thể làm điều đó.

Thứ hai, Server.Transferduy trì URL gốc trong trình duyệt. Điều này thực sự có thể giúp hợp lý hóa các kỹ thuật nhập dữ liệu, mặc dù nó có thể gây nhầm lẫn khi gỡ lỗi.

Đó không phải là tất cả: Server.TransferPhương thức này cũng có tham số thứ hai là "reservedForm". Nếu bạn đặt điều này thành True, sử dụng một câu lệnh, chẳng hạn như Server.Transfer("WebForm2.aspx", True)chuỗi truy vấn hiện có và bất kỳ biến mẫu nào sẽ vẫn có sẵn cho trang bạn đang chuyển đến.

Ví dụ: nếu WebForm1.aspx của bạn có điều khiển TextBox có tên là TextBox1 và bạn đã chuyển sang WebForm2.aspx với tham số reservedForm được đặt thành True, bạn có thể truy xuất giá trị của điều khiển TextBox trang gốc bằng cách tham khảo Request.Form("TextBox1").


10
+1 cho nhận xét nhưng điều này dường như được sao chép nguyên văn từ developer.com/net/asp/article.php/3299641 . Nếu nó là từ một nguồn khác, bạn nên cho thuê trích dẫn nó.
Johnno Nolan

... nhưng họ đã sao chép nó nên trích dẫn bạn.
Johnno Nolan

7
Tôi nói: Một cái gì đó tôi tìm thấy và đồng ý với;
TStamper

6
Nên liên kết với nguồn và sử dụng định dạng trích dẫn / tô sáng cho các phần được sao chép.
Chris W. Rea

1
Làm thế nào có thể maintaining the original URL... ...really help streamline data entry techniques?
JohnB

36

Response.Redirect() nên được sử dụng khi:

  • chúng tôi muốn chuyển hướng yêu cầu đến một số trang HTML đơn giản trên máy chủ của chúng tôi hoặc đến một số máy chủ web khác
  • chúng tôi không quan tâm đến việc gây ra vòng tròn bổ sung cho máy chủ theo từng yêu cầu
  • chúng tôi không cần bảo tồn Chuỗi truy vấn và Biến mẫu từ yêu cầu ban đầu
  • chúng tôi muốn người dùng của chúng tôi có thể thấy URL được chuyển hướng mới nơi anh ấy được chuyển hướng trong trình duyệt của mình (và có thể đánh dấu nó nếu cần thiết)

Server.Transfer() nên được sử dụng khi:

  • chúng tôi muốn chuyển yêu cầu trang hiện tại sang một trang .aspx khác trên cùng một máy chủ
  • chúng tôi muốn bảo tồn tài nguyên máy chủ và tránh các vòng tròn không cần thiết cho máy chủ
  • chúng tôi muốn duy trì Biến chuỗi truy vấn và biến biểu mẫu (tùy chọn)
  • chúng tôi không cần hiển thị URL thực nơi chúng tôi đã chuyển hướng yêu cầu trong Trình duyệt web của người dùng

2
Rõ ràng hơn nhiều, đối với tôi điều này tốt hơn là một câu trả lời được chấp nhận.
Baljeetsingh

28

Phản hồi Chuyển hướng trang này sang trang khác sau khi trang đầu tiên đến máy khách. Vì vậy, khách hàng biết chuyển hướng.

Server.Transfer thoát khỏi thực thi hiện tại của trang. Khách hàng không biết chuyển hướng. Nó cho phép bạn chuyển chuỗi truy vấn và biến biểu mẫu.

Vì vậy, nó phụ thuộc vào nhu cầu của bạn để lựa chọn đó là tốt hơn.


1
Người dùng độc hại có thể bỏ qua Response.Redirectđể tải trang gốc mặc dù tôi đã gọi Response.Redirectkhông?
Northben

@northben - Không bao giờ dễ dàng nói "không" khi nói đến công nghệ vì hầu như mọi thứ đều có thể bị xâm phạm - nhưng trong trường hợp này làm sao họ có thể - tôi sẽ nói không họ không thể ... nhưng tôi đã được chứng minh là sai nhiều lần trong cuộc sống.
JonH

23

nhập mô tả hình ảnh ở đây

"answer.redirect" và "server.transfer" giúp chuyển người dùng từ trang này sang trang khác trong khi trang đang thực thi. Nhưng cách họ thực hiện việc chuyển / chuyển hướng này rất khác nhau.

Trong trường hợp bạn là người trực quan và muốn xem trình diễn hơn là lý thuyết, tôi sẽ đề nghị xem video facebook dưới đây giải thích sự khác biệt theo cách minh họa hơn.

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

Sự khác biệt chính giữa họ là ai thực hiện chuyển nhượng. Trong "answer.redirect", quá trình chuyển được thực hiện bởi trình duyệt trong khi ở "server.transfer", nó được thực hiện bởi máy chủ. Chúng ta hãy cố gắng hiểu tuyên bố này một cách chi tiết hơn.

Trong "Server.Transfer" sau đây là trình tự về cách chuyển tiền xảy ra: -

1. Người dùng gửi yêu cầu đến trang ASP.NET. Trong hình bên dưới, yêu cầu được gửi đến "WebForm1" và chúng tôi muốn điều hướng đến "Webform2".

2.Server bắt đầu thực thi "Webform1" và vòng đời của trang bắt đầu. Nhưng trước khi hoàn thành vòng đời của trang, Server Server.transfer đã xảy ra với "WebForm2".

3. Đối tượng trang "Webform2" được tạo, vòng đời trang đầy đủ được thực thi và phản hồi HTML đầu ra sau đó được gửi đến trình duyệt.

nhập mô tả hình ảnh ở đây

Trong khi trong "Feedback.Redirect" sau đây là chuỗi các sự kiện để điều hướng: -

1.Client (trình duyệt) gửi yêu cầu đến một trang. Trong hình bên dưới, yêu cầu được gửi đến "WebForm1" và chúng tôi muốn điều hướng đến "Webform2".

2. Chu kỳ sống của "Webform1" bắt đầu thực thi. Nhưng ở giữa vòng đời "Phản hồi. Chuyển hướng" xảy ra.

3. Bây giờ thay vì máy chủ thực hiện chuyển hướng, anh ta sẽ gửi lệnh HTTP 302 đến trình duyệt. Lệnh này cho trình duyệt biết rằng anh ta phải bắt đầu một yêu cầu GET đến trang "Webform2.aspx".

4.Brower diễn giải lệnh 302 và gửi yêu cầu GET cho "Webform2.aspx".

nhập mô tả hình ảnh ở đây

Nói cách khác, "Server.Transfer" được máy chủ thực thi trong khi "Feedback.Redirect" được thực thi bởi trình duyệt thr. "Feedback.Redirect" cần hai yêu cầu để thực hiện chuyển hướng trang.

Vậy khi nào nên sử dụng "Server.Transfer" và khi nào nên sử dụng "Feedback.Redirect"?

Sử dụng "Server.Transfer" khi bạn muốn điều hướng các trang nằm trên cùng một máy chủ, sử dụng "Feedback.Redirect" khi bạn muốn điều hướng giữa các trang nằm trên máy chủ và miền khác nhau.

nhập mô tả hình ảnh ở đây

Dưới đây là bảng tóm tắt trong đó đưa ra sự khác biệt và sử dụng kịch bản nào.

nhập mô tả hình ảnh ở đây


Hữu ích khi gặp sự cố khi sử dụng Server.Transfer và
Feedback.Redirect

Server.Transfer: cùng một máy chủ hoặc cùng một trang web IIS ?
Kiquenet

Bạn có thể vui lòng cập nhật đoạn văn sau vì có ít nhất 6 ký tự cần thiết cho chỉnh sửa của tôi không: Nói cách khác "Server.Transfer" được máy chủ thực thi trong khi "Feedback.Redirect" được thực thi bởi trình duyệt thr . "Feedback.Redirect" cần hai yêu cầu để thực hiện chuyển hướng trang.
paul cheung

11

Vẻ đẹp của Server.Transfer là những gì bạn có thể làm với nó:

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

Bạn có thể lấy bất cứ thứ gì từ trang trước của mình bằng phương pháp trên miễn là bạn sử dụng Server.Transfer nhưng không phản hồi.


10

Ngoài nhận xét của ScarletGarden, bạn cũng cần xem xét tác động của các công cụ tìm kiếm và chuyển hướng của bạn. Trang này đã di chuyển vĩnh viễn? Một cách tạm thời? Nó làm cho một sự khác biệt.

xem: Phản hồi.Redirect so với "301 Đã di chuyển vĩnh viễn" :

Tất cả chúng ta đều đã sử dụng Feedback.Redirect vào lúc này hay lúc khác. Đó là cách nhanh chóng và dễ dàng để khiến khách truy cập chỉ đúng hướng nếu bằng cách nào đó họ kết thúc ở sai vị trí. Nhưng bạn có biết rằng Feedback.Redirect gửi mã trạng thái phản hồi HTTP là "302 Found" khi bạn thực sự muốn gửi "301 Đã di chuyển vĩnh viễn"?

Sự khác biệt có vẻ nhỏ, nhưng trong một số trường hợp nhất định, nó thực sự có thể tạo ra sự khác biệt lớn. Ví dụ: nếu bạn sử dụng mã phản hồi "301 Đã di chuyển vĩnh viễn", hầu hết các công cụ tìm kiếm sẽ xóa liên kết lỗi thời khỏi chỉ mục của họ và thay thế bằng mã mới. Nếu bạn sử dụng "302 Found", họ sẽ tiếp tục quay lại trang cũ ...


Liên kết không hoạt động. Sử dụng liên kết web.archive.org này để thay thế.
stomy

6

Chuyển hoàn toàn là phía máy chủ. Thanh địa chỉ khách hàng không đổi. Một số phức tạp về việc chuyển ngữ cảnh giữa các yêu cầu. Việc xử lý và khởi động lại trình xử lý trang có thể rất tốn kém, do đó, việc chuyển khoản của bạn sớm trong đường ống, ví dụ như trong một HTTPModule trong BeginRequest. Đọc tài liệu MSDN một cách cẩn thận, kiểm tra và hiểu các giá trị mới của HttpContext.Request - đặc biệt là trong các kịch bản Postback. Chúng tôi thường sử dụng Server.Transfer cho các tình huống lỗi.

Chuyển hướng chấm dứt yêu cầu với trạng thái 302 và phản hồi khứ hồi phía máy khách với và bên trong ăn một ngoại lệ (máy chủ nhỏ hoàn hảo - tùy thuộc vào số lượng bạn làm trong một ngày) Máy khách sau đó điều hướng đến địa chỉ mới. Thanh địa chỉ trình duyệt và cập nhật lịch sử, v.v ... Khách hàng trả chi phí cho một lần làm tròn thêm - chi phí thay đổi tùy theo độ trễ. Trong kinh doanh của chúng tôi, chúng tôi chuyển hướng rất nhiều, chúng tôi đã viết mô-đun riêng của chúng tôi để tránh chi phí ngoại lệ.


6

Có nhiều sự khác biệt như được chỉ định ở trên. Ngoài ra, còn có một sự khác biệt nữa. Response.Redirect()có thể được sử dụng để chuyển hướng người dùng đến bất kỳ trang nào không phải là một phần của ứng dụng nhưng Server.Transfer()chỉ có thể được sử dụng để chuyển hướng người dùng trong ứng dụng.

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

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

5

Feedback.Redirect tốn kém hơn vì nó bổ sung thêm một chuyến đi đến máy chủ để tìm ra nơi cần đến.

Server.Transfer hiệu quả hơn tuy nhiên nó có thể gây ra một chút sai lầm cho người dùng vì Url không thay đổi về mặt vật lý.

Theo kinh nghiệm của tôi, sự khác biệt về hiệu suất không đủ quan trọng để sử dụng phương pháp sau


4

Server.Transfer không thay đổi URL trong trình duyệt máy khách, do đó, trình duyệt không biết bạn đã thay đổi thành trình xử lý phía máy chủ khác. Phản hồi.Redirect bảo trình duyệt chuyển sang một trang khác, do đó url trong thanh tiêu đề thay đổi.

Server.Transfer nhanh hơn một chút vì nó tránh được một vòng cho máy chủ, nhưng việc không thay đổi url có thể tốt hoặc xấu cho bạn, tùy thuộc vào những gì bạn đang cố gắng làm.


4

Phản hồi.Redirect: cho trình duyệt biết rằng trang được yêu cầu có thể được tìm thấy tại một vị trí mới. Trình duyệt sau đó bắt đầu một yêu cầu khác đến trang mới tải nội dung của nó trong trình duyệt. Điều này dẫn đến hai yêu cầu của trình duyệt.

Server.Transfer: Nó chuyển thực thi từ trang đầu tiên sang trang thứ hai trên máy chủ. Theo như trình duyệt của khách hàng, nó đã đưa ra một yêu cầu và trang ban đầu là trang đáp ứng với nội dung. Lợi ích của phương pháp này là một chuyến đi khứ hồi đến máy chủ từ trình duyệt máy khách. Ngoài ra, bất kỳ biến số biểu mẫu được đăng và tham số chuỗi truy vấn cũng có sẵn cho trang thứ hai.


3

Chỉ cần biết thêm chi tiết về Transfer (), thực ra đó là Server.Execute () + Feedback.End (), mã nguồn của nó nằm bên dưới (từ Mono / .net 4.0):

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

và với Execute (), cái cần chạy là trình xử lý của đường dẫn đã cho, xem

ASP.NET không xác minh rằng người dùng hiện tại được ủy quyền để xem tài nguyên được phân phối theo phương thức Execute . Mặc dù logic ủy quyền và xác thực ASP.NET chạy trước khi trình xử lý tài nguyên ban đầu được gọi, ASP.NET trực tiếp gọi trình xử lý được chỉ định bởi phương thức Execute và không chạy lại xác thực và logic ủy quyền cho tài nguyên mới. Nếu chính sách bảo mật của ứng dụng của bạn yêu cầu khách hàng có quyền truy cập tài nguyên phù hợp, ứng dụng sẽ buộc ủy quyền lại hoặc cung cấp cơ chế kiểm soát truy cập tùy chỉnh.

Bạn có thể buộc ủy quyền lại bằng cách sử dụng phương thức Redirect thay vì phương thức Execute . Redirect thực hiện chuyển hướng phía máy khách trong đó trình duyệt yêu cầu tài nguyên mới. Vì chuyển hướng này là một yêu cầu mới vào hệ thống, nên nó phải tuân theo tất cả logic xác thực và ủy quyền của cả chính sách bảo mật Dịch vụ thông tin Internet (IIS) và ASP.NET.

- từ MSDN


2

Feedback.Redirect liên quan đến một chuyến đi khứ hồi thêm và cập nhật thanh địa chỉ.

Server.Transfer không làm cho thanh địa chỉ thay đổi, máy chủ đáp ứng yêu cầu với nội dung từ một trang khác

ví dụ

Phản hồi. Chuyển hướng: -

  1. Trên máy khách, trình duyệt yêu cầu một trang http: //InitivelyRequestedPage.aspx
  2. Trên máy chủ đáp ứng yêu cầu với 302 chuyển địa chỉ chuyển hướng http: //AntherPage.aspx .
  3. Trên máy khách, trình duyệt đưa ra yêu cầu thứ hai tới địa chỉ http: //AntherPage.aspx .
  4. Trên máy chủ phản hồi với nội dung từ http: //AntherPage.aspx

Máy chủ.Transfer: -

  1. Trên trình duyệt máy khách yêu cầu một trang http: //InitivelyRequestedPage.aspx
  2. Trên máy chủ Server.Transfer đến http: //AntherPage.aspx
  3. Trên máy chủ, phản hồi được thực hiện theo yêu cầu http: //InitivelyRequestedPage.aspx gửi lại nội dung từ http: //AntherPage.aspx

Phản hồi

Ưu điểm: - RESTful - Nó thay đổi thanh địa chỉ, địa chỉ có thể được sử dụng để ghi lại các thay đổi trạng thái giữa các yêu cầu.

Nhược điểm: - Chậm - Có thêm một chuyến đi khứ hồi giữa máy khách và máy chủ. Điều này có thể tốn kém khi có độ trễ đáng kể giữa máy khách và máy chủ.

Server.Transfer

Ưu điểm: - Nhanh chóng.

Nhược điểm: - Mất trạng thái - Nếu bạn đang sử dụng Server.Transfer để thay đổi trạng thái của ứng dụng để phản hồi lại bài đăng, nếu trang được tải lại thì trạng thái đó sẽ bị mất, vì thanh địa chỉ sẽ giống như trước đây theo yêu cầu đầu tiên.


0

Feedback.Redirect Feedback.Redirect () sẽ đưa bạn đến một trang mới, cập nhật thanh địa chỉ và thêm nó vào Lịch sử trình duyệt. Trên trình duyệt của bạn, bạn có thể nhấp lại. Nó chuyển hướng yêu cầu đến một số trang HTML đơn giản trên máy chủ của chúng tôi hoặc đến một số máy chủ web khác. Nó gây ra vòng tròn bổ sung cho máy chủ theo từng yêu cầu. Nó không bảo tồn Chuỗi truy vấn và Biến mẫu từ yêu cầu ban đầu. Nó cho phép xem URL được chuyển hướng mới nơi nó được chuyển hướng trong trình duyệt (và có thể đánh dấu nó nếu cần thiết). Phản ứng. Redirect chỉ cần gửi tin nhắn xuống trình duyệt (HTTP 302).

Server.Transfer Server.Transfer () không thay đổi thanh địa chỉ, chúng tôi không thể quay lại. Một người nên sử dụng Server.Transfer () khi anh ấy / cô ấy không muốn người dùng thấy mình đang đi đâu. Thỉnh thoảng trên một trang loại "đang tải". Nó chuyển yêu cầu trang hiện tại sang một trang .aspx khác trên cùng một máy chủ. Nó bảo tồn tài nguyên máy chủ và tránh các roundtrips không cần thiết cho máy chủ. Nó bảo tồn Chuỗi truy vấn và Biến hình thức (tùy chọn). Nó không hiển thị URL thực nơi nó chuyển hướng yêu cầu trong Trình duyệt web của người dùng. Server.Transfer xảy ra mà trình duyệt không biết gì, trình duyệt yêu cầu một trang, nhưng máy chủ trả về nội dung của trang khác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.