2011-11-23 46 views
19

Tôi đang sử dụng TempData để bảo vệ mô hình của mình khi sử dụng RedirectToAction. Nó hoạt động tốt, nhưng tôi có một cảm giác dai dẳng rằng nó có thể không phải là điều đúng để làm. Tôi thực sự cố gắng tránh sử dụng dữ liệu Phiên và tôi đã đọc rằng TempData sử dụng Phiên. Có an toàn để sử dụng không? Có vấn đề nào có thể phát sinh khi sử dụng nó trong môi trường cân bằng tải không?TempData: Có an toàn không?

Câu hỏi bên lề: "Có an toàn không?" - đặt tên cho phim.

+3

Có bí mật không? Nó có an toàn không? – Dismissile

Trả lời

21

Có, TempData được hỗ trợ bởi bộ nhớ phiên, vì vậy nếu bạn đang ở trong môi trường cân bằng tải, bạn phải cẩn thận khi sử dụng nó (phiên cố định, trạng thái phiên liên tục, v.v ...).

TempData là sự lựa chọn không thực tế khi sử dụng mẫu PRG và được thiết kế cho nó.

Cho dù đó là điều đúng đắn để làm ... nó phụ thuộc vào trường hợp sử dụng của bạn!

PS Marathon Man.

+2

bắt đẹp trên người đàn ông marathon - phim hay. –

1

Tôi đã giới hạn việc sử dụng TempData để chuyển thông báo xác thực đối tượng mô hình giữa các chế độ xem và hành động. Tôi đã không nhìn vào việc sử dụng Tempdata từ quan điểm bảo mật nhưng sau SO thread thảo luận giống nhau: HttpContext.Items with ASP.NET MVC. Xem các nhận xét cuối cùng về chuỗi và các cuộc thảo luận có liên quan.

2

Tôi sẽ đi, bất cứ khi nào có thể, để có cách tiếp cận hoàn toàn phi trạng thái. Đó là khả năng mở rộng hơn và không bị ảnh hưởng bởi các vấn đề với các máy chủ cá nhân. Thông thường, bạn chỉ có thể sử dụng một cookie (được bảo vệ đúng cách chống giả mạo) để nhận dạng người dùng và kéo dữ liệu từ cơ sở dữ liệu mỗi lần.

Bên cạnh đó, tôi cũng khuyên bạn nên đánh giá xem bạn có thể sử dụng View thay vì RedirectToAction hay không. Đây:

TempData["model"] = model; 
return RedirectToAction("SomeAction"); 

có thể được thay thế bằng:

return View("SomeAction", model); 

Dĩ nhiên giả sử "SomeAction" là một cái nhìn hợp lệ mà có thể truy cập từ bộ điều chỉnh dòng (nó là một trong hai quan điểm trong ctrl cùng hoặc một định nghĩa trong Shared) và đó không chỉ là một hành động trung gian chuyển hướng đến một hành động khác.

+4

một vấn đề tôi có với trở lại Xem() là nếu hành động là một bài, sau đó làm mới trong trình duyệt bật lên thông điệp gây phiền nhiễu-- khi có thể tôi muốn kết thúc với được. Có lẽ đó là một chút ngớ ngẩn-- sau đó một lần nữa, dữ liệu tạm thời bị mất khi làm mới anyway-- vì vậy có lẽ đó là một điểm tranh luận. –

+0

Vâng, nhưng bạn thực sự nên làm theo các nguyên tắc RESP. Nếu một hành động đang đọc dữ liệu, nó nên (bình thường) là một GET. Nếu hành động đang sửa đổi dữ liệu, nó phải là POST (và * never * a GET). –

+0

@DarioSolera Bạn vẫn có thể làm điều đó và kết thúc bằng GET. Cho phép nói rằng tôi có một hành động sửa đổi dữ liệu. Đó là một phương thức POST. Nếu xác thực (phía máy chủ) cho hành động không thành công, bạn có thể đẩy mọi thứ trong TempData và chuyển hướng trở lại trang GET để nó hiển thị tất cả các lỗi xác thực mô hình của bạn, v.v ... và nếu bạn làm mới trang, nó sẽ chỉ rõ ràng trang thay vì nhận được tin nhắn đăng lại. – Dismissile

5

Vâng, tôi cho rằng điều đó phụ thuộc. Nếu bạn xử lý nhiều lưu lượng truy cập với các cân bằng tải và nhiều máy chủ kết thúc, thì các đối tượng phiên là thứ cần tránh vì nó có thể làm giảm hiệu suất và làm cho việc mở rộng quy mô rất khó (trên yêu cầu trang trại không đến cùng một máy chủ web).

TempData tồn tại trong thời gian ngắn và nếu bạn không đặt nhiều đối tượng ở đó và suy nghĩ kỹ về kiến ​​trúc toàn bộ, thì tôi nghĩ nó an toàn. Có rất nhiều trang web sử dụng nó rộng rãi và không gặp vấn đề gì (tôi đã làm việc trên các trang web được chia sẻ và lưu trữ riêng với tối đa 50-70k khách truy cập/ngày sử dụng phiên, thường với web và db trên cùng một máy chủ).

+0

đó là hữu ích để nghe .. cảm ơn! –

2

Session State có thể làm việc trong một môi trường clustered, với điều kiện là một trong hai điều xảy ra

  1. cân bằng tải của bạn hỗ trợ "sticky" sessions (ví dụ:tất cả các yêu cầu trong một phiên nhất định được chuyển đến cùng một máy)
  2. Bạn cấu hình cung cấp dịch vụ phiên sử dụng một trong số nhà cung cấp phiên quá trình, bạn có thể sử dụng một trong hai ASP.NET State Service hoặc SQL Session State Provider

Các câu hỏi liệu bạn nên sử dụng tempdata hay không là một câu hỏi hoàn toàn khác nhau. Tôi cho rằng thường có một cách xung quanh nó. Nếu bạn đang cố gắng để tránh một hit vào cơ sở dữ liệu để tải lại một đối tượng mà một hành động đã được tải, hãy nhìn vào bằng cách sử dụng một bộ nhớ cache để thay thế.