2010-03-25 4 views
5

Tôi đang phát triển một ứng dụng ASP.NET MVC 2 kết nối với một số dịch vụ để thực hiện truy xuất và cập nhật dữ liệu. Các dịch vụ yêu cầu tôi cung cấp thực thể gốc cùng với thực thể được cập nhật khi cập nhật dữ liệu. Điều này là để nó có thể thay đổi theo dõi và đồng thời lạc quan. Không thể thay đổi dịch vụ.Dữ liệu phức tạp liên tục giữa các lần đăng trong ASP.NET MVC

Vấn đề của tôi là tôi cần phải bằng cách nào đó lưu trữ thực thể gốc giữa các lần đăng lại. Trong WebForms, tôi đã sử dụng ViewState, nhưng từ những gì tôi đã đọc, đó là cho MVC. Các giá trị ban đầu không phải là bằng chứng giả mạo vì các dịch vụ coi chúng là không đáng tin cậy. Các thực thể sẽ là (tối đa) 1k và nó là một ứng dụng mạng nội bộ.

Các tùy chọn tôi đã đưa ra là:

  1. phiên - loại trừ khả năng - Lưu trữ các đơn vị trong phiên, nhưng tôi không thích ý tưởng này như không có kế hoạch để chia sẻ phiên giữa
  2. URL - loại trừ khả năng - dữ liệu là quá lớn
  3. HiddenField - Lưu trữ các thực thể tuần tự trong một lĩnh vực ẩn, có lẽ với mã hóa/mã hóa
  4. HiddenVersion - Các thực thể có trường phiên bản (SQL) trên chúng, mà tôi có thể đưa vào trường ẩn. Sau đó, trên một lưu tôi nhận được thực thể "bản gốc" từ các dịch vụ và so sánh các phiên bản, làm đồng thời lạc quan của riêng tôi.
  5. Cookies - Giống như 3 hoặc 4, nhưng sử dụng một cookie thay vì một lĩnh vực ẩn

Tôi đang nghiêng về phía tùy chọn 4, mặc dù 3 sẽ đơn giản hơn. Các tùy chọn hợp lệ này hay tôi đang đi sai đường? Có cách nào tốt hơn để làm điều này?

+0

Đừng quên TempData http://stackoverflow.com/search?q=tempdata – R0MANARMY

+0

@ R0manarmy Không phải là TempData chỉ hợp lệ cho yêu cầu hiện tại? –

+0

Rõ ràng là nó đã thay đổi rất nhiều trong ASP.NET MVC2 http://blog.donnfelker.com/2010/02/26/aspnet-mvc2-tempdata-now-persists/ Lựa chọn khá "Chúng tôi đã thay đổi việc triển khai trong MVC 2 hơi như một kết quả: giá trị sẽ được gỡ bỏ từ TempData sau khi yêu cầu trong đó nó được đọc, do đó, nó sẽ tiếp tục tồn tại trong từ điển TempData của bạn cho đến khi bạn hiển thị nó trong một số trang.Điều này cho phép một kịch bản đa chuyển hướng (chẳng hạn như Đăng nhập Windows Live ID) để sử dụng TempData và nó vẫn được treo xung quanh cho đến khi bạn sẵn sàng cho nó. " – R0MANARMY

Trả lời

1

Nếu bạn lưu trữ nó trong một phiên thì bạn cần đảm bảo rằng nếu bạn triển khai một trang trại mà phiên được tải chính xác.

Hiện tại chúng tôi có (chính xác) cùng một câu hỏi tại thời điểm này và những gì chúng tôi đã quyết định làm là triển khai Mẫu lưu trữ và liên kết nó với một cookie.Sau đó, nếu điều này trở thành một vấn đề, chúng ta có thể chỉ cần đặt trong trình quản lý phiên, trình quản lý db hoặc bất kỳ thứ gì và mã của chúng tôi thậm chí không cần biết vì mẫu kho lưu trữ.

Chúng tôi đã dò tìm ý tưởng về các trường bị ẩn nhưng cảm thấy quá giống với ViewState và tất cả chúng ta đều ghét nó trong WebForms để ý tưởng bị loại bỏ. Nhưng không chỉ vì chúng tôi ghét trạng thái xem. Đã xảy ra sự cố khi bạn nhấn Ctrl F5. Nội dung sẽ bị xóa và sau đó bạn sẽ làm gì?

Vì vậy, tại thời điểm này, mẫu lưu trữ của nó có cookie có thể thay đổi nhưng việc triển khai tự cho vay để thay đổi.

EDIT

Chúng tôi cũng đã quyết định chống lại các trường ẩn vì nó sẽ là quá dễ dàng để thực hiện thay đổi đối với họ và do đó bạn cần phải làm một số công cụ mã thông báo từ máy chủ để đảm bảo nó wans't giả mạo.

Các trường ẩn chỉ tiếp tục tăng thêm độ phức tạp cho những gì về cơ bản nên là một vấn đề rất đơn giản.

Ít nhất đó là suy nghĩ của chúng tôi về vấn đề này.

+0

Bạn đang liên kết một chuỗi các yêu cầu trang cụ thể với mục trong kho lưu trữ như thế nào? Ví dụ: nếu một người dùng có hai cùng một trang đang mở, thì một trang khác sẽ thay đổi? Ngoài ra bạn có xóa các mục sau một khoảng thời gian đã đặt để lưu bộ nhớ không? –

+0

Ctrl-F5 sẽ không phải là vấn đề vì dữ liệu chỉ được sử dụng trên "PostBack", tức là khi nhấn nút lưu. –

+0

Không quan tâm đến ctrl + F5, F5 thông thường có thể gửi lại biểu mẫu trước đó. Trong một số trường hợp, nhấp vào nút Quay lại trong trình duyệt cũng có thể gửi lại biểu mẫu. Một trong hai trường hợp đó có phải là một vấn đề hay một thực thể nhất định chỉ được cập nhật hai lần với cùng một giá trị (hoạt động thứ hai về cơ bản là một no-op)? – R0MANARMY

1

Tôi không hoàn toàn chắc chắn tại sao Phiên là một ý tưởng tồi, nếu liều của khách hàng không cần bản sao lưu đó, hãy giữ toàn bộ nội dung trong bộ nhớ máy chủ có âm thanh tốt nhất; vì phần còn lại của các ứng viên đều gửi từ máy chủ đến nơi (tạm thời) trong trình duyệt của khách hàng, và sau đó lấy lại nó bất cứ khi nào khách hàng thực hiện bất kỳ hành động nào. Tình huống là, bất cứ khi nào khách hàng ping lại, máy chủ sẽ giải nén dữ liệu được mã hóa (hoặc trong trường ẩn, cookie, url vv) và có thể sẽ lại nằm trong máy chủ! Nó cũng lãng phí IMO băng thông. OK, nếu khách hàng cần (để kiểm tra) bản sao lưu, tôi sẽ xem xét trường ẩn (set) hoặc đơn giản là tuần tự hóa dữ liệu trong XML và đặt nó ở đâu đó trong HTML.

EDIT

Tôi vẫn bỏ phiếu cho Phiên. Nếu bạn có kế hoạch chăm sóc trang trại máy chủ, xem xét thực hiện một nhà cung cấp máy chủ phiên chéo:

http://msdn.microsoft.com/en-us/library/ms178587%28VS.80%29.aspx

và chỉ cần lưu trữ nhà nước trong cơ sở dữ liệu.

+0

Lý do chống lại phiên là chúng tôi sẽ không chia sẻ phiên giữa các máy chủ web và chúng tôi không biết phải giữ dữ liệu trong bộ nhớ cache trong bao lâu. Ngoài ra, chúng tôi vẫn sẽ cần một cách để thêm số nhận dạng vào trang để liên kết chỉnh sửa cụ thể với thực thể của nó. –