В чем разница между государством и лицом без гражданства?

86

Книги и документация по MVC просто нагромождают использование терминов без учета состояния и состояния. Честно говоря, я просто не могу понять, о чем говорят книги. Они не приводят пример, чтобы понять какое-либо из этих состояний, вместо того, чтобы просто сказать, что HTTP не имеет состояния и с ASP.NET MVC Microsoft поддерживает это. Я скучаю по некоторым фундаментальным знаниям, потому что я не могу понять, что с состоянием и почему с состоянием и то же самое относится и к лицам без гражданства.

Простой и короткий пример, в котором говорится о кнопке или текстовом поле, например элементе управления, может быть проще для понимания, я полагаю.

Панкадж Упадхяй
источник

Ответы:

40

Отсутствие состояния означает, что HTTP не имеет встроенной поддержки состояний; например, вы не можете сохранить, если пользователь вошел в систему или сделал что-то еще.

Наиболее распространенным решением является использование сеансов для преодоления этой проблемы. Это означает, что вы должны иметь возможность включать идентификатор сеанса в каждый ответ или запрос. Это можно сделать либо путем создания файла cookie сеанса, либо путем включения идентификатора сеанса во все ссылки.

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

В вашем примере вы упомянули кнопки и текстовые поля. Самый простой способ позволить им поддерживать свое состояние - просто прекратить отправку всей страницы назад. MVC получил отличную поддержку ajax (через jQuery), и я предлагаю вам использовать ajax, если вы просто хотите что-то сделать на текущей странице.

jgauffin
источник
3
это означает, что если я вошел на веб-сайт, каждая страница, которую я посещаю, просто перепроверяется для проверки подлинности перед отображением содержимого с помощью идентификатора сеанса или файла cookie сеанса ??
Панкадж Упадхяй
3
Да, это правильно.
jgauffin
так без гражданства лучше или хуже?
Лукас - Лучшая академия кодирования
1
@ think123: это более производительно, так как вам не нужно управлять состоянием (то есть балансировка нагрузки и т. д. намного проще). Это еще сложнее, так как вы должны управлять искусственным состоянием.
jgauffin
5
@jgauffin: Перформант здесь не то слово. Stateless является менее производительным , так как вы не имеете возможность кэшировать состояние и должны смотреть его несколько раз. Что это более масштабируемо ; вот где начинается балансировка нагрузки, и выгоды от масштабируемости могут компенсировать потери производительности, когда ваша система становится достаточно большой.
Мейсон Уилер
108

Stateless - нет памяти (состояния), которая поддерживается программой

Stateful - программа имеет память (состояние)

Чтобы проиллюстрировать концепцию состояния, я определю функцию с состоянием и функцию без состояния

Stateless

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

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

Stateful

//The state is maintained by the function

private int _number = 0; //initially zero 

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

Как уже говорили другие, http по своей сути не имеет состояния. Таким образом, государство должно быть встроено в ваши приложения.

Представьте себе запрос через Интернет, где у вас есть клиентский браузер, взаимодействующий с процессом сервера. Чтобы поддерживать состояние по протоколу HTTP без сохранения состояния, браузер обычно отправляет на сервер идентификатор сеанса при каждом запросе. Для каждого запроса сервер будет выглядеть как «ах, этот парень». Информация о состоянии затем может быть найдена в памяти на стороне сервера или в базе данных на основе этого идентификатора сеанса.

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

кодировщик
источник
Быстрый вопрос: поэтому, если идентификатор сеанса используется (то есть украден) другим пользователем, сервер не будет знать, что это кто-то еще?
Михай
4
Это правильно. Существуют способы защитить личность пользователя, например, с помощью файлов cookie https или httponly. Но если компьютер пользователя скомпрометирован, то злоумышленник может обмануть сервер, думая, что он пользователь.
кодер
2
+1 для ясного и хрустящего примера кода. Я все больше убеждаюсь в том, что самые сложные термины в области ИТ можно понимать только в контексте.
Себастьян
Возможность кражи идентификатора сеанса является одной из причин того, что вам нужно быть осторожным, а приложения, подобные CMS или что-то вроде OAuth, создают способы, которые усложняют задачу.
Елин
4
Для каждого запроса сервер будет выглядеть как «ах, это этот парень», - лучше сказать, что во всех других примерах, которые я видел,
Рафаэль Эйнг
69

без гражданства означает, что нет памяти о прошлом. Каждая транзакция выполняется так, как если бы она была сделана в первый раз.

Statefull означает, что есть память о прошлом. Предыдущие транзакции запоминаются и могут повлиять на текущую транзакцию.

CWallach
источник
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 is selected».
    Затем с обратной версией браузер отправляет ViewState и «B выбран» на сервер. ASP.NET восстанавливает начальное состояние списка и применяет новый выбор «B». Это было сделано, чтобы заманить разработчиков WinForms (упомянутых @Ronald). На веб-сервере вы можете подписаться на изменения списка listObject.Changed += OnChanged.

  • ASP.NET MVC
    Проблема с ViewState заключается в размере. В течение многих лет разработчики .NET вынуждали передавать килобайты бесполезной информации, например, состояния 20 элементов управления для каждой передачи туда и обратно.
    Новый подход заключается в отправке только нового и небольшого значения «B».
    Или, если вы хотите отслеживать изменение с «A» на «B», то реализуйте его самостоятельно. Использование JavaScript и отправка «Был А, теперь Б». Или сохранить и восстановить состояние по идентификатору в SQL Server.

  • ASP.NET MVC и ASP.NET реализуют состояние для аутентификации и кэширования. Поэтому неверно говорить, что ASP.NET MVC полностью не имеет состояния.
  • Память, упомянутая в ответах, означает «запоминание», а не память компьютера. Состояние может быть реализовано путем хранения данных в файловой системе, на сервере SQL или в памяти компьютера.
Artru
источник
пожалуйста, будьте конструктивны и объясните ошибку, прежде чем ставить минус
Артру
0

Операция с состоянием изменяет или требует некоторого состояния системы, а операция без состояния - нет.

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

Общей формой комментария по электронной почте с тегом mailto: будет текстовое поле без состояния - оно принимает ваш ввод и отправляет его в почтовое приложение вашей рабочей станции без сохранения какой-либо информации.

lonstar
источник
Типичная форма «оставьте свой адрес электронной почты и сообщение, и мы свяжемся с вами» также не имеет статуса. Когда вы отправляете форму, серверу все равно, откуда вы ее взяли, и он просто копирует данные в какой-то список задач обслуживания клиентов и забывает об этом.
StarWeaver