web-dev-qa-db-ja.com

ステートフルとステートレスの違いは何ですか?

MVCに関する書籍とドキュメントは、ステートフルとステートレスの用語を使用することを重視しています。正直なところ、私はそれについての考え、本が話していることを理解することができません。彼らは、HTTPがステートレスであり、ASP.NET MVCでMicrosoftがそれに対応していることを伝えるだけでなく、どちらかの状態を理解するための例を示していません。ステートフルとは何か、なぜステートフルであり、ステートレスにも同じことが言えるのか理解できないので、いくつかの基本的な知識が欠けていますか?.

ボタンやテキストボックスなどのコントロールについて説明する簡単で短い例は、私が理解している理解を単純化することができます。

90
Pankaj Upadhyay

ステートレスとは、HTTPにステートのサポートが組み込まれていないことを意味します。例えばユーザーがログインしたか、何か他のことをした場合は保存できません。

最も一般的な解決策は、セッションを使用してその問題を克服することです。つまり、各応答または要求にセッションIDを含めることができる必要があります。これは、セッションCookieを作成するか、すべてのリンクにセッション識別子を含めることによって行われます。

WebFormsは(ViewStateを使用して)そのすべてを透明にしようとしますが、MVCは手動で処理するように強制します。

あなたの例では、ボタンとテキストボックスに言及しました。状態を維持する最も簡単な方法は、ページ全体の投稿を停止することです。 MVCは(jQueryを介して)ajaxの優れたサポートを得ており、現在のページで何かを実行したいだけの場合はajaxを使用することをお勧めします。

41
jgauffin

ステートレス-プログラムによって維持されるメモリ(状態)はありません

ステートフル-プログラムにはメモリ(状態)があります

状態の概念を説明するために、statefulである関数とstatelessである関数を定義します。

ステートレス

//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は本質的にステートレスです。したがって、状態をアプリケーションに組み込む必要があります。

クライアントプロセスがサーバープロセスと通信しているWeb上のリクエストを想像してください。ステートレスhttpプロトコルを介して状態を維持するために、ブラウザーは通常、要求ごとにセッションIDをサーバーに送信します。リクエストごとに、サーバーは「ああ、この人」のようになります。次に、このセッションIDに基づいて、サーバー側のメモリまたはデータベースで状態情報を検索できます。

純粋にステートレスな環境では、このセッションIDは必要ありません。各リクエストには、サーバーが処理する必要のあるすべての情報が含まれます。しかし、多くのアプリケーションでは、特定のコンテンツを表示するためにセッションが認証されているかどうか、またはユーザーの操作を追跡するために、状態を維持する必要があります。リクエストごとにネットワーク経由でユーザーの認証情報を送信する必要はありません。

111
coder

ステートレスとは、過去の記憶がないことを意味します。すべてのトランザクションは、それが初めて行われたかのように実行されます。

statefullは過去の記憶があることを意味します。以前のトランザクションは記憶され、現在のトランザクションに影響を与える可能性があります。

70
CWallach

私の簡単な意見では、ASP.NET(ステートフル)とASP.NET-MVC(ステートレス)の違いは、最初のコントロールがサーバー側のコントロールを提供し、他のコントロールが提供しないという事実に分離できます。

ASP.NET Webフォームのアプローチは、古いVBおよびイベントモデル駆動型モデルで使用されるVC++プログラマーを移行することを目的としています。ボタンをクリックしてイベントをトリガーするのと同じように、同じイベントモデルパラダイムです。ここで行う必要があるのは、イベントハンドラーにコードを記述することだけです。そのため、ASP.NETには、監視するビューステートやポストバックなどの概念が必要ですサーバー側の状態が各ラウンドトリップを制御します。

ただし、ASP.NET-MVCはサーバー側のコントロールを使用しないため、状態を維持する必要はありません。 MVCモデルは、問題のドメインを3つのパーティションに分割し、データが効率的にクライアントに配信されるようにします。

要約すると、サーバー側のコントロールは、ステートフルとステートレスの点で異なる点です。

3
Ronald

@coderの正確な回答への追加。

状態の概念は、覚えている以前のデータです。
たとえば、サーバーにリストコントロールがあり、値「A、B、C」と「A」が選択されています。リストはクライアントブラウザに行きます。 「B」を選択します。そして、サーバーにポストバックします。値が変更されたことをどのようにして知っていますか?

  • ASP.NET
    MicrosoftはASP.NETで用語ViewStateを使用しています。それについて開発者の間で大きな誤解があります。
    ViewStateは、リストのすべての初期状態を<input type="hidden" value="base64 encoded" />に保持します。値は「A、B、C」で、「Aが選択されている」とマークされています。
    その後、ポストバックブラウザでViewStateを送信し、「B is selected」をサーバーに送信します。 ASP.NETはリストの初期状態を復元し、新しい「B」選択を適用します。これは、WinForms開発者を魅了するために行われました(@Ronaldが言及)。 Webサーバーでは、リストの変更listObject.Changed += OnChangedに登録できます。

  • ASP.NET MVC
    ViewStateの問題はサイズです。長年にわたり、.NET開発者は、ラウンドトリップごとに20個のコントロールの状態など、不要な情報のキロバイトを転送することを余儀なくされていました。
    新しいアプローチは、新しい小さな「B」値のみを送信することです。
    または、「A」から「B」への変更を追跡する場合は、独自に実装します。 javascriptを使用して「Was A、Now B」を送信します。または、SQL ServerでIDを使用して状態を保存および取得します。

  • ASP.NET MVCおよびASP.NETは、認証およびキャッシングの状態を実装します。したがって、ASP.NET MVCが完全にステートレスであると言うのは正しくありません。
  • メモリ回答で言及されているのは、コンピュータのメモリではなく「記憶」を意味します。状態は、ファイルシステム、SQLサーバー、またはコンピューターメモリにデータを保存することで実装できます。
1
Artru

ステートフル操作はシステムの一部の状態を変更または要求しますが、ステートレス操作は変更しません。

ステートフルテキストボックスの例は、StackExchangeで以前に編集されたコメントです。テキストボックスは、以前のコメントを表示し、入力を受け入れて処理するために関与したポストスレッドを知る必要があります。

Mailto:タグが付いた一般的な電子メールのコメントフォームは、ステートレステキストボックスです。入力を受け入れ、情報を保持せずにワークステーションのメールアプリケーションにそれを投げます。

0
lonstar