Яка різниця між державними і без громадянства?


86

Книги та документація на MVC просто купують умови використання Stateful і без громадянства. Якщо чесно, я просто не можу зрозуміти, про що говорять книги. Вони не дають приклад для розуміння будь-якого з цих станів, а не просто розповідають, що HTTP без громадянства, і ASP.NET MVC microsoft йде разом із цим. Мені не вистачає якихось фундаментальних знань, оскільки я не можу зрозуміти, що є державним і чому є державним, і те саме стосується без громадянства.

Простий і короткий приклад, який говорить про таке управління, як кнопка чи текстове поле, може спростити розуміння, я думаю.

Відповіді:


40

Без громадянства означає, що HTTP не має вбудованої підтримки держав; наприклад, ви не можете зберігати, якщо користувач увійшов або зробив щось інше.

Найпоширеніше рішення - використовувати сеанси для подолання цієї проблеми. Це означає, що ви повинні мати можливість включати ідентифікатор сеансу у кожну відповідь чи запит. Це робиться шляхом створення файлу cookie сесії або включенням ідентифікатора сеансу у всі посилання.

WebForms намагається зробити все це прозорим (використовуючи ViewState), тоді як MVC змушує вас обробляти це вручну.

У своєму прикладі ви згадали про кнопки та текстові скриньки. Найпростіший спосіб дозволити їм зберегти свій стан - це просто припинити публікацію на всій сторінці. MVC отримав чудову підтримку для ajax (через jQuery), і я пропоную вам використовувати ajax, якщо ви просто хочете щось зробити на поточній сторінці.


3
це означає, що якщо я зареєстрований на веб-сайті, кожна сторінка, яку я відвідую, просто перевіряє автентифікацію, перш ніж надати вміст за допомогою ідентифікатора сесії або сеансового файлу cookie ??
Pankaj Upadhyay

3
так, це правильно.
jgauffin

так що без громадянства краще чи гірше?
Лукас - Краща академія кодування

1
@ think123: Це більш ефективно, оскільки вам не доведеться керувати станом (тобто балансування завантаження тощо - це набагато простіше). Це все складніше, оскільки вам доведеться керувати штучним станом.
jgauffin

5
@jgauffin: У виконавця тут неправильне слово. Без громадянства є менш ефективною, оскільки у вас немає можливості кешувати стан і доведеться шукати його кілька разів. Що це масштабніше ; ось де відбувається балансування навантаження, і прибуток від масштабованості може компенсувати втрати в продуктивності, коли ваша система стає достатньо великою.
Мейсон Уілер

108

Без громадянства - Немає пам'яті (стану), яка підтримується програмою

Stateful - Програма має пам'ять (стан)

Щоб проілюструвати поняття стану я визначити функцію , яка є станом , і той , який є особою без громадянства

Без громадянства

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

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

Державний

//The state is maintained by the function

private int _number = 0; //initially zero 

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

Як говорили інші, http по суті є без громадянства. Отже, стан повинен бути вбудований у ваші програми

Уявіть запит через Інтернет, де у вас є клієнтський браузер, який спілкується з сервером. Щоб підтримувати стан над протоколом без стану http, браузер зазвичай надсилає ідентифікатор сеансу серверу на кожен запит. Для кожного запиту сервер буде схожий на "ах, це його хлопець". Потім інформацію про стан можна шукати в пам'яті на стороні сервера або в базі даних на основі цього ідентифікатора сеансу.

У середовищі суто без громадянства цей ідентифікатор сеансу не знадобиться. Кожен запит містив би всю інформацію, яку потрібно обробляти серверу. Але багатьом додаткам потрібно підтримувати стан, щоб відстежувати, автентифіковано чи не сеанс, щоб переглянути певний вміст або відслідковувати, що робить користувач. Ви не хочете надсилати облікові дані користувачів для кожного запиту.


швидке запитання: тож якщо ідентифікатор сеансу використовується (тобто вкрадений) іншим користувачем, сервер не підозрює, що це хтось інший?
mihai

4
Це правильно. Існують способи захисту ідентичності користувача, такі як використання файлів https або httpsly cookie. Але якщо комп'ютер користувача зламаний, то зловмисник може обдурити сервер думати, що він є користувачем.
кодер

2
+1 для чіткого і чіткого прикладу коду. Я все більше переконаний, що найбільш складні терміни ІТ можна розуміти лише в контексті.
Себастьян

Можливість викрадення ідентифікатора сеансу є однією з причин того, що вам потрібно бути обережними, а додатки, такі як CMS або щось на зразок OAuth, будують таким чином, щоб зробити це набагато складніше.
Елін

4
Для кожного запиту сервер буде схожий на "а, його цей хлопець" - краще сказати, що в кожному іншому прикладі, який я бачив
Рафаель Ейн

69

без громадянства означає, що немає пам’яті про минуле. Кожна транзакція виконується так, ніби це робиться вперше.

державний означає, що є пам'ять про минуле. Попередні транзакції запам'ятовуються і можуть впливати на поточну транзакцію.


9
На це слід було відповісти. Це на сьогоднішній день найясніша і найточніша відповідь.
Mawg

3
Простий і акуратний.
Іван Івкович

2
Це точно для всіх, хто вже знає різницю.
Рафаель Ейн

3

На мою просту думку, різницю між ASP.NET (державний) та ASP.NET-MVC (без стану) можна виокремити до того, що перший забезпечує управління на стороні сервера, а другий - ні.

Варто зазначити, що підхід веб-форм ASP.NET орієнтований на перехід старих програмістів VB та VC ++, які використовуються в моделі подієвої моделі, щоб мати хороший швидкий спосіб навчання веб-програмування, виконуючи ту саму парадигму моделі події, як ви клацаєте кнопка та вуаля ви запускаєте подію! Все, що вам потрібно зробити зараз, це записати свій код у обробник подій. Через це ASP.NET потрібно було мати такі поняття, як стан перегляду та поштові розсилки для контролю за станом сервера, що контролює кожну туру.

Однак ASP.NET-MVC не використовує серверні елементи керування, тому йому не потрібно підтримувати стан. Модель MVC розділяє проблемний домен на три розділи, щоб дані доставлялися клієнту впорядкованому способі.

Підсумовуючи це, управління на стороні сервера - це те, що робить їх різними, наскільки вони є державними і без громадянства.


1

Додаток до точної відповіді @coder.

Ідея держави полягає в запам'ятовуванні попередніх даних .
Наприклад, у вас на сервері є контроль списку зі значеннями "A, B, C" та "A". Список переходить до браузера клієнтів. Ви вибираєте "B". І відправити назад на сервер. Як би ви знали, що значення змінюється?

  • ASP.NET
    Microsoft використовує термін ViewState в ASP.NET. Серед розробників існує величезне непорозуміння.
    ViewState містить усі початкові стани списку в <input type="hidden" value="base64 encoded" />: значення "A, B, C" і відмічено "A вибрано".
    Потім браузер з повідомленням назад надсилає ViewState і "B вибрано" на сервер. ASP.NET відновлює початковий стан списку та застосовує новий вибір "B". Це було зроблено для того, щоб заманити розробників WinForms (згадав @Ronald). На веб-сервері ви можете передплатити список змін listObject.Changed += OnChanged.

  • ASP.NET MVC
    Проблема з ViewState полягає в розмірі. Протягом багатьох років розробники .NET змушували передавати кілобайти непотрібної інформації, як, наприклад, стани з 20 елементів керування для кожного переходу.
    Новий підхід полягає в тому, щоб надсилати лише нове і мале значення "В".
    Або якщо ви хочете відслідковувати зміну від "A" до "B", тоді реалізуйте її самостійно. Використання javascript та надсилання "Was A, Now B". Або збережіть і отримайте стан за ідентифікатором у SQL Server.

  • ASP.NET MVC та ASP.NET реалізують стан для аутентифікації та отримання готівки. Тож невірно сказати, що ASP.NET MVC повністю без громадянства.
  • Пам'ять, згадана у відповідях, означає "запам'ятовування", а не пам'ять комп'ютера. Стан можна реалізувати, зберігаючи дані у файловій системі, SQL-сервері або пам'яті комп'ютера.

будьте конструктивними та поясніть помилку перед тим, як ставити мінус
Artru

0

Державна операція змінює або вимагає певного стану системи, а операція без стану не робить.

Прикладом значущого текстового поля може бути попередньо відредагований коментар до StackExchange - у текстовому полі потрібно відображати ваш попередній коментар та знати пост-нитку, з якою він брав участь, щоб прийняти та обробити ваш вклад.

Загальна форма коментарів електронною поштою з тегом mailto: була б текстовою скринькою без громадянства - вона приймає ваші дані та передає їх поштовій програмі вашої робочої станції, не зберігаючи жодної інформації.


Типова форма "залиште свою електронну адресу та повідомлення, і ми повернемося до вас" також не має статусу. Коли ви надсилаєте форму, сервер не хвилює, звідки ви його отримали, і він просто копіює дані в якийсь список даних служби обслуговування клієнтів і забуває про нього.
StarWeaver
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.