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


86

MVCに関する書籍とドキュメントは、ステートフルおよびステートレスの用語を使用することについての山に過ぎません。正直に言うと、私はその考え、本が何を言っているのかをつかむことができません。HTTPがステートレスであり、ASP.NET MVCでMicrosoftがそれに従っていることを伝えるだけでなく、いずれかの状態を理解するための例を示していません。ステートフルなものとステートフルな理由を理解できないため、基本的な知識が不足していますか?

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

回答:


40

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

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

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

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


3
つまり、Webサイトにログインしている場合、アクセスするすべてのページは、セッションIDまたはセッションCookieを介してコンテンツをレンダリングする前に認証を再確認するだけです。
Pankaj Upadhyay

3
それは正解です。
-jgauffin

ステートレスは良くも悪くもありますか?
ルーカス-ベターコーディングアカデミー14

1
@ think123:状態を管理する必要がないため、パフォーマンスが向上します(つまり、負荷分散などがはるかに簡単になります)。人工的な状態を管理する必要があるので、それはどれほど複雑になります。
jgauffin 14

5
@jgauffin:パフォーマンスはここでは間違った言葉です。ステートレスは、状態をキャッシュして繰り返し検索する機会がないため、パフォーマンスが低下します。それがよりスケーラブルです; そこで負荷分散が行われます。システムが十分に大きくなった場合、スケーラビリティの向上によりパフォーマンスの低下を相殺できます。
メイソンウィーラー

108

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

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

状態の概念を説明するために、ステートフルな関数とステートレス関数を定義します

ステートレス

//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が別のユーザーによって使用された(つまり、盗まれた)場合、サーバーはこれが他のユーザーであることを認識しませんか?
ミハイ

4
そのとおりです。httpsまたはhttponly Cookieを使用するなど、ユーザーのIDを保護する方法があります。しかし、ユーザーのコンピューターが侵害された場合、攻撃者はサーバーをだましてユーザーであると考える可能性があります。
コーダー14

2
+1を使用して、明確でサクサクしたコード例を示します。私は、最も複雑なIT用語は文脈でしか理解できないと確信しています。
セバスチャン

セッションIDが盗まれる可能性があることに注意する必要がある理由の1つは、CMSなどのアプリケーションやOAuthのようなものが、それをはるかに困難にする方法でビルドすることです。
エリン

4
サーバーは、リクエストごとに「ああ、この男」のようになります
ラファエル・アイン

69

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

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


9
これは答えを与えられるべきでした。ここでは、最も明確で正確な答えです。
Mawg

3
シンプルで正確。
イヴァン

2
違いをすでに知っている人なら誰でも正確です。
ラファエル・アイン

3

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

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

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

要約すると、サーバー側のコントロールは、ステートフルとステートレスという点でそれらを異なるものにします。


1

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

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

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

  • ASP.NET MVC
    ViewStateの問題はサイズです。何年もの間、.NET開発者は、すべての往復で20個のコントロールの状態のように、キロバイトの役に立たない情報を転送せざるを得ませんでした。
    新しいアプローチは、新しい小さな「B」値のみを送信することです。
    または、「A」から「B」への変更を追跡する場合は、独自に実装します。JavaScriptを使用して、「以前はA、現在はB」を送信しました。または、SQL ServerでIDによって状態を保存および取得します。

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

マイナスを入れる前に建設的でエラーを説明してください
Artru

0

ステートフル操作はシステムの一部の状態を変更または必要としますが、ステートレス操作はそうではありません。

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

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


典型的な「あなたのメールアドレスとメッセージを残してください。折り返し連絡します」フォームもステートレスです。フォームを送信すると、サーバーは取得元を気にせず、データをカスタマーサービスのToDoリストにコピーするだけで、それを忘れます。
StarWeaver 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.