Sự khác biệt giữa trạng thái và trạng thái là gì?


86

Các cuốn sách và tài liệu về MVC chỉ sử dụng các thuật ngữ Stateful và Statless. Thành thật mà nói, tôi chỉ không thể nắm bắt được ý tưởng của nó, những gì các cuốn sách đang nói về. Họ không đưa ra một ví dụ để hiểu bất kỳ trạng thái nào, thay vì chỉ nói rằng HTTP là không trạng thái và với ASP.NET MVC microsoft sẽ đi cùng với nó. Tôi có thiếu một số kiến ​​thức cơ bản không, vì tôi không thể hiểu thế nào là trạng thái và tại sao trạng thái lại giống nhau và không có trạng thái.

Một ví dụ đơn giản và ngắn nói về nút điều khiển hoặc hộp văn bản có thể đơn giản hóa cách hiểu mà tôi cho là.

Câu trả lời:


40

Không quốc tịch có nghĩa là HTTP không được xây dựng để hỗ trợ cho các tiểu bang; ví dụ: bạn không thể lưu trữ nếu người dùng đã đăng nhập hoặc làm việc khác.

Giải pháp phổ biến nhất là sử dụng các phiên để khắc phục vấn đề đó. Điều này có nghĩa là bạn phải có thể bao gồm một định danh phiên trong mỗi phản hồi hoặc yêu cầu. Điều này được thực hiện bằng cách tạo cookie phiên hoặc bằng cách bao gồm mã định danh phiên trong tất cả các liên kết.

WebForms cố gắng làm cho tất cả trong suốt (sử dụng ViewState) trong khi MVC buộc bạn phải xử lý thủ công.

Trong ví dụ của bạn, bạn đã đề cập đến Nút và TextBoxes. Cách dễ nhất để cho phép họ duy trì trạng thái của họ chỉ đơn giản là ngừng đăng lại toàn bộ trang. MVC có hỗ trợ tuyệt vời cho ajax (thông qua jQuery) và tôi khuyên bạn nên sử dụng ajax nếu bạn chỉ muốn làm gì đó trên trang hiện tại.


3
điều này có nghĩa là nếu tôi đăng nhập vào một trang web, mỗi trang tôi truy cập chỉ kiểm tra lại để xác thực trước khi hiển thị nội dung qua mã định danh phiên hoặc cookie phiên ??
Pankaj Upadhyay

3
Vâng đúng rồi.
jgauffin

vậy là không quốc tịch tốt hơn hay xấu hơn?
Lucas - Học viện mã hóa tốt hơn

1
@ think123: Nó hiệu quả hơn vì bạn không phải quản lý trạng thái (tức là cân bằng tải, v.v ... dễ dàng hơn rất nhiều). Nó phức tạp hơn bao giờ hết kể từ khi bạn phải quản lý trạng thái nhân tạo.
jgauffin

5
@jgauffin: Người biểu diễn là từ sai ở đây. Statless là ít hiệu suất hơn vì bạn không có cơ hội để lưu trữ trạng thái và phải tìm kiếm nó nhiều lần. Những gì nó có khả năng mở rộng hơn ; đó là nơi cân bằng tải xuất hiện và lợi ích từ khả năng mở rộng có thể bù đắp tổn thất về hiệu suất khi hệ thống của bạn đủ lớn.
Mason Wheeler

108

Không quốc tịch - Không có bộ nhớ (trạng thái) được duy trì bởi chương trình

Stateful - Chương trình có bộ nhớ (trạng thái)

Để minh họa khái niệm trạng thái, tôi sẽ định nghĩa một hàm có trạng thái và một hàm không trạng thái

Không quốc tịch

//The state is derived by what is passed into the function

function int addOne(int number)
{
    return number + 1;
}

Nhà nước

//The state is maintained by the function

private int _number = 0; //initially zero 

function int addOne()
{
    _number++;
    return _number;
}

Như những người khác đã nói http là không quốc tịch. Vì vậy, trạng thái phải được xây dựng vào các ứng dụng của bạn.

Hãy tưởng tượng một yêu cầu qua web nơi bạn có trình duyệt máy khách liên lạc với quy trình máy chủ. Để duy trì trạng thái qua giao thức http không trạng thái, trình duyệt sẽ gửi thông thường gửi định danh phiên tới máy chủ theo từng yêu cầu. Đối với mỗi yêu cầu, máy chủ sẽ giống như "ah, anh chàng này". Thông tin trạng thái sau đó có thể được tra cứu trong bộ nhớ phía máy chủ hoặc trong cơ sở dữ liệu dựa trên id phiên này.

Trong một môi trường hoàn toàn không trạng thái, bạn sẽ không cần id phiên này. Mỗi yêu cầu sẽ chứa tất cả thông tin mà máy chủ sẽ cần xử lý. Nhưng nhiều ứng dụng cần duy trì trạng thái để theo dõi xem phiên có được xác thực hay không để xem nội dung nhất định hoặc theo dõi những gì người dùng đang làm. Bạn sẽ không muốn gửi thông tin đăng nhập của người dùng qua dây cho mỗi yêu cầu.


Câu hỏi nhanh: vậy nếu Id phiên được sử dụng (tức là bị đánh cắp) bởi một người dùng khác, máy chủ sẽ không biết đây là ai khác?
mihai

4
Đúng rồi. Có nhiều cách để bảo vệ danh tính người dùng, chẳng hạn như sử dụng cookie https hoặc httponly. Nhưng nếu máy tính của người dùng bị xâm nhập thì kẻ tấn công có thể đánh lừa máy chủ nghĩ rằng họ là người dùng.
viên

2
+1 cho một ví dụ mã rõ ràng và giòn. Tôi tin chắc rằng hầu hết các thuật ngữ CNTT phức tạp chỉ có thể được hiểu trong ngữ cảnh.
Sebastian

Khả năng ID phiên bị đánh cắp là một lý do khiến bạn phải cẩn thận và các ứng dụng như CMS hoặc thứ gì đó như OAuth xây dựng theo cách để làm cho việc đó khó hơn rất nhiều.
Elin

4
Đối với mỗi yêu cầu, máy chủ sẽ giống như "ah, anh chàng này" - nói tốt hơn là trong mọi ví dụ khác tôi đã thấy
Rafael Eyng

69

không quốc tịch có nghĩa là không có ký ức về quá khứ. Mọi giao dịch được thực hiện như thể nó được thực hiện lần đầu tiên.

trạng thái có nghĩa là có ký ức của quá khứ. Các giao dịch trước được ghi nhớ và có thể ảnh hưởng đến giao dịch hiện tại.


9
Điều này nên đã được trao câu trả lời. Đây là câu trả lời rõ ràng và chính xác nhất ở đây.
Mawg

3
Đơn giản và chính xác.
Ivan Ivković

2
Nó là chính xác cho bất cứ ai đã biết sự khác biệt.
Rafael Eyng

3

Theo ý kiến ​​đơn giản của tôi, sự khác biệt giữa ASP.NET (stateful) và ASP.NET-MVC (không trạng thái) có thể được tách biệt với thực tế là cái đầu tiên cung cấp các điều khiển phía máy chủ và cái kia thì không.

Điều đáng chú ý là cách tiếp cận biểu mẫu web ASP.NET hướng đến việc chuyển đổi các lập trình viên VB và VC ++ cũ, được sử dụng trong mô hình hướng sự kiện để có cách học lập trình web nhanh chóng theo mô hình mô hình sự kiện tương tự, như bạn nhấp vào một nút và voila bạn kích hoạt một sự kiện! Tất cả những gì bạn cần làm bây giờ là viết mã của bạn trong trình xử lý sự kiện. Do đó, ASP.NET cần có các khái niệm như trạng thái xem và postback để theo dõi trạng thái của phía máy chủ kiểm soát mỗi chuyến đi khứ hồi.

Tuy nhiên, ASP.NET-MVC không sử dụng các điều khiển phía máy chủ nên không phải duy trì trạng thái. Mô hình MVC phân tách miền vấn đề thành ba phân vùng để dữ liệu được gửi đến máy khách theo cách hợp lý.

Tóm lại, các điều khiển phía máy chủ là những gì làm cho chúng khác nhau về trạng thái và trạng thái không trạng thái.


1

Ngoài ra câu trả lời chính xác @coder.

Ý tưởng của nhà nước là ghi nhớ dữ liệu trước đó .
Ví dụ: bạn có một điều khiển danh sách trên máy chủ với các giá trị "A, B, C" và "A" được chọn. Danh sách đi đến trình duyệt của khách hàng. Bạn chọn "B". Và gửi lại cho máy chủ. Làm thế nào bạn biết rằng giá trị được thay đổi?

  • ASP.NET
    Microsoft sử dụng thuật ngữ ViewState trong ASP.NET. Có một sự hiểu lầm rất lớn giữa các nhà phát triển về nó.
    ViewState giữ tất cả trạng thái ban đầu của danh sách trong <input type="hidden" value="base64 encoded" />: giá trị "A, B, C" và đánh dấu "A được chọn".
    Sau đó, với trình duyệt gửi lại, gửi ViewState và "B được chọn" đến máy chủ. ASP.NET khôi phục trạng thái ban đầu của danh sách và áp dụng lựa chọn "B" mới. Điều này đã được thực hiện để thu hút các nhà phát triển WinForms (được đề cập bởi @Ronald). Trên máy chủ web, bạn có thể đăng ký để thay đổi danh sách listObject.Changed += OnChanged.

  • ASP.NET MVC
    Vấn đề với ViewState là kích thước. Trong nhiều năm, các nhà phát triển .NET buộc phải chuyển kilobyte thông tin vô dụng, như trạng thái 20 điều khiển cho mỗi vòng.
    Cách tiếp cận mới là chỉ gửi giá trị "B" mới và nhỏ.
    Hoặc nếu bạn muốn theo dõi sự thay đổi từ "A" sang "B" thì hãy tự thực hiện nó. Sử dụng javascript và gửi "Was A, Now B". Hoặc lưu và truy xuất trạng thái bằng ID trong SQL Server.

  • ASP.NET MVCASP.NET thực hiện trạng thái Xác thực và Rút tiền. Vì vậy, không đúng khi nói rằng ASP.NET MVC hoàn toàn không trạng thái.
  • Bộ nhớ được đề cập trong các câu trả lời có nghĩa là "ghi nhớ", không phải bộ nhớ máy tính. Trạng thái có thể được thực hiện bằng cách lưu trữ dữ liệu trong hệ thống Tệp, máy chủ SQL hoặc Bộ nhớ máy tính.

vui lòng xây dựng và giải thích lỗi trước khi trừ
Artru 8/8/2015

0

Một hoạt động trạng thái sửa đổi hoặc yêu cầu một số trạng thái của hệ thống, và một hoạt động không trạng thái thì không.

Ví dụ về hộp văn bản trạng thái sẽ là một nhận xét được chỉnh sửa trước đó trên StackExchange - hộp văn bản cần hiển thị nhận xét trước đó của bạn và biết chủ đề bài đăng có liên quan để chấp nhận và xử lý dữ liệu nhập của bạn.

Biểu mẫu nhận xét email chung với thẻ mailto: sẽ là một hộp văn bản không trạng thái - nó chấp nhận đầu vào của bạn và ném nó vào ứng dụng thư của máy trạm của bạn mà không giữ lại bất kỳ thông tin nào.


Một biểu mẫu "để lại địa chỉ email và tin nhắn của bạn và chúng tôi sẽ liên lạc lại với bạn" cũng không trạng thái. Khi bạn gửi biểu mẫu, máy chủ sẽ không quan tâm bạn đã lấy nó từ đâu và nó chỉ sao chép dữ liệu vào một số danh sách việc cần làm của dịch vụ khách hàng và quên nó đi.
StarWeaver
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.