ความแตกต่างระหว่างสถานะและไร้สัญชาติคืออะไร?


86

หนังสือและเอกสารเกี่ยวกับ MVC เป็นเพียงกองในการใช้เงื่อนไข Stateful และไร้สัญชาติ บอกตามตรงฉันไม่สามารถคว้าความคิดของมันสิ่งที่หนังสือกำลังพูดถึง พวกเขาไม่ได้ยกตัวอย่างให้เข้าใจสถานะใดสถานะหนึ่งแทนที่จะบอกว่า HTTP นั้นไร้สถานะและด้วย ASP.NET MVC microsoft ก็จะเข้ากันได้ดี ฉันขาดความรู้พื้นฐานบ้างไหมเพราะฉันไม่สามารถเข้าใจสิ่งที่เป็นรัฐและทำไมรัฐจึงเหมือนกันและไร้สัญชาติ

ตัวอย่างที่ง่ายและสั้นที่พูดถึงการควบคุมเช่นปุ่มหรือกล่องข้อความสามารถทำให้เข้าใจได้ง่ายขึ้น

คำตอบ:


40

ไร้สัญชาติหมายความว่า HTTP ไม่ได้สร้างการสนับสนุนสำหรับอเมริกา เช่นคุณไม่สามารถจัดเก็บได้หากผู้ใช้ลงชื่อเข้าใช้หรือทำอย่างอื่น

ทางออกที่พบบ่อยที่สุดคือการใช้เซสชันเพื่อเอาชนะปัญหานั้น ซึ่งหมายความว่าคุณจะต้องมีตัวระบุเซสชันในการตอบกลับหรือคำขอแต่ละรายการ สิ่งนี้สามารถทำได้โดยการสร้างคุกกี้เซสชั่นหรือโดยรวมถึงตัวระบุเซสชันในการเชื่อมโยงทั้งหมด

WebForms พยายามทำให้ทุกอย่างโปร่งใส (ใช้ ViewState) ในขณะที่ MVC บังคับให้คุณจัดการด้วยตนเอง

ในตัวอย่างของคุณคุณกล่าวถึงปุ่มและกล่องข้อความ วิธีที่ง่ายที่สุดเพื่อให้พวกเขารักษาสถานะไว้ก็คือหยุดโพสต์กลับทั้งหน้า MVC ได้รับการสนับสนุนที่ยอดเยี่ยมสำหรับ ajax (ผ่าน jQuery) และฉันขอแนะนำให้คุณใช้ ajax หากคุณต้องการทำอะไรบางอย่างในหน้าปัจจุบัน


3
ซึ่งหมายความว่าถ้าฉันเข้าสู่ระบบในเว็บไซต์ทุกหน้าที่ฉันเยี่ยมชมเพียงตรวจสอบการตรวจสอบก่อนที่จะแสดงเนื้อหาผ่านตัวระบุเซสชั่นหรือคุกกี้เซสชั่น?
Pankaj Upadhyay

3
ใช่ที่ถูกต้อง.
jgauffin

การไร้สัญชาตินั้นดีขึ้นหรือแย่ลง?
Lucas - Better Coding Academy

1
@ think123: มันมีประสิทธิภาพมากกว่าเพราะคุณไม่ต้องจัดการสถานะ (เช่นโหลดบาลานซ์ ฯลฯ ง่ายกว่ามาก) มันมีความซับซ้อนมากขึ้นเพียงใดตั้งแต่คุณต้องจัดการสถานะเทียม
jgauffin

5
@jgauffin: นักแสดงเป็นคำที่ผิดที่นี่ ไร้สัญชาตินั้นมีประสิทธิภาพน้อยกว่าเพราะคุณไม่มีโอกาสแคชสถานะและต้องค้นหามันซ้ำ ๆ มันสามารถปรับขนาดได้มากกว่านี้ นั่นคือที่มาของ load balancing และผลกำไรจาก scalability สามารถชดเชยการขาดทุนในประสิทธิภาพเมื่อระบบของคุณมีขนาดใหญ่พอ
Mason Wheeler

108

ไร้สัญชาติ - ไม่มีหน่วยความจำ (สถานะ) ที่ดูแลโดยโปรแกรม

Stateful - โปรแกรมมีหน่วยความจำ (สถานะ)

เพื่อแสดงให้เห็นถึงแนวคิดของรัฐฉันจะกำหนดฟังก์ชั่นที่statefulและหนึ่งที่ไร้สัญชาติ

ไร้สัญชาติ

//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 ไร้สัญชาติเบราว์เซอร์จะส่งโดยทั่วไปจะส่งตัวระบุเซสชันไปยังเซิร์ฟเวอร์ในแต่ละคำขอ สำหรับคำขอแต่ละครั้งเซิร์ฟเวอร์จะเป็น "อามันเป็นคนนี้" สามารถค้นหาข้อมูลสถานะในหน่วยความจำฝั่งเซิร์ฟเวอร์หรือในฐานข้อมูลโดยยึดตามรหัสเซสชันนี้

ในสภาพแวดล้อมที่ไร้สัญชาติอย่างแท้จริงคุณไม่จำเป็นต้องใช้รหัสเซสชันนี้ แต่ละคำขอจะมีข้อมูลทั้งหมดที่เซิร์ฟเวอร์จะต้องดำเนินการ แต่แอปพลิเคชันจำนวนมากจำเป็นต้องรักษาสถานะเพื่อติดตามว่าเซสชันนั้นได้รับการรับรองความถูกต้องเพื่อดูเนื้อหาบางอย่างหรือเพื่อติดตามสิ่งที่ผู้ใช้กำลังทำอยู่ คุณไม่ต้องการที่จะส่งข้อมูลประจำตัวของผู้ใช้มากกว่าลวดสำหรับแต่ละคำขอ


คำถามอย่างรวดเร็ว: ดังนั้นหากมีการใช้รหัสเซสชัน (เช่นถูกขโมย) โดยผู้ใช้รายอื่นเซิร์ฟเวอร์จะไม่ทราบว่านี่เป็นคนอื่นหรือไม่
mihai

4
ถูกต้อง. มีวิธีในการปกป้องข้อมูลประจำตัวของผู้ใช้เช่นการใช้ https หรือคุกกี้แบบ httponly แต่ถ้าคอมพิวเตอร์ของผู้ใช้ถูกบุกรุกจากนั้นผู้โจมตีสามารถหลอกเซิร์ฟเวอร์ในการคิดว่าพวกเขาเป็นผู้ใช้
coder

2
+1 สำหรับตัวอย่างโค้ดที่ชัดเจนและกรอบ ฉันเชื่อมั่นมากขึ้นว่าคำศัพท์ไอทีที่ซับซ้อนที่สุดสามารถเข้าใจได้ในบริบทเท่านั้น
เซบาสเตียน

ความเป็นไปได้ของรหัสเซสชันที่ถูกขโมยคือเหตุผลหนึ่งที่คุณต้องระวังและแอปพลิเคชันเช่น CMS หรือสิ่งที่คล้ายกับ OAuth ที่สร้างขึ้นในลักษณะที่จะทำให้การดำเนินการนั้นยากขึ้นมาก
Elin

4
สำหรับคำขอแต่ละครั้งเซิร์ฟเวอร์จะเป็น "อามันเป็นผู้ชายคนนี้" - ดีกว่ากล่าวว่าในทุก ๆ ตัวอย่างที่ฉันเคยเห็น
Rafael Eyng

69

ไร้สัญชาติหมายถึงไม่มีความทรงจำในอดีต การทำธุรกรรมทุกครั้งจะดำเนินการราวกับว่ามันกำลังถูกทำขึ้นเป็นครั้งแรก

statefull หมายความว่ามีหน่วยความจำในอดีต การทำธุรกรรมก่อนหน้านี้จะถูกจดจำและอาจส่งผลกระทบต่อการทำธุรกรรมปัจจุบัน


9
สิ่งนี้ควรได้รับการตอบแล้ว มันเป็นคำตอบที่ชัดเจนและแม่นยำที่สุดที่นี่
Mawg

3
เรียบง่ายและแม่นยำ
Ivan Ivković

2
มันถูกต้องสำหรับทุกคนที่รู้ความแตกต่างแล้ว
Rafael Eyng

3

ในความเห็นอย่างง่ายของฉันความแตกต่างระหว่าง ASP.NET (stateful) และ ASP.NET-MVC (ไร้สัญชาติ) สามารถแยกได้จากข้อเท็จจริงที่ว่าครั้งแรกที่มีการควบคุมฝั่งเซิร์ฟเวอร์และอื่น ๆ ไม่ได้

เป็นที่น่าสังเกตว่า ASP.NET web form approach นั้นมุ่งเน้นไปที่การเปลี่ยนโปรแกรมเก่าของ VB และ VC ++ โปรแกรมเมอร์ที่ใช้ใน model model driven model เพื่อให้มีวิธีที่รวดเร็วในการเรียนรู้การเขียนโปรแกรมเว็บตามกระบวนทัศน์โมเดลเหตุการณ์เช่นเดียวกับคุณ ปุ่มและ voila คุณทำให้เกิดเหตุการณ์! สิ่งที่คุณต้องทำตอนนี้คือเขียนรหัสของคุณในตัวจัดการเหตุการณ์ เนื่องจาก ASP.NET นั้นจำเป็นต้องมีแนวคิดเช่น view state และ postbacks เพื่อตรวจสอบสถานะของฝั่งเซิร์ฟเวอร์ที่ควบคุมแต่ละรอบการเดินทาง

อย่างไรก็ตาม 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 ตัวควบคุมสำหรับการไปกลับทุกครั้ง
    วิธีการใหม่คือการส่งเฉพาะค่า "B" ใหม่และเล็ก
    หรือถ้าคุณต้องการติดตามการเปลี่ยนแปลงจาก "A" ถึง "B" ให้ทำการเปลี่ยนแปลงด้วยตัวคุณเอง ใช้ javascript และส่ง "Was A, Now B" หรือบันทึกและดึงสถานะด้วย ID ใน SQL Server

  • ASP.NET MVCและASP.NETดำเนินการสถานะสำหรับการรับรองความถูกต้องและ Cashing ดังนั้นจึงไม่ถูกต้องที่จะบอกว่า ASP.NET MVC ไร้สัญชาติอย่างสมบูรณ์
  • หน่วยความจำที่กล่าวถึงในคำตอบหมายถึง "จดจำ" ไม่ใช่หน่วยความจำคอมพิวเตอร์ รัฐสามารถดำเนินการได้โดยการจัดเก็บข้อมูลในระบบไฟล์เซิร์ฟเวอร์ SQL หรือหน่วยความจำคอมพิวเตอร์

โปรดสร้างสรรค์และอธิบายข้อผิดพลาดก่อนทำการลบ
Artru

0

การดำเนินการ stateful แก้ไขหรือต้องการบางสถานะของระบบและการดำเนินการไร้สัญชาติไม่ได้

ตัวอย่างของกล่องข้อความรัฐจะเป็นความคิดเห็นที่แก้ไขก่อนหน้านี้ใน StackExchange - กล่องข้อความจำเป็นต้องแสดงความคิดเห็นก่อนหน้าของคุณและรู้ว่าโพสต์เธรดที่เกี่ยวข้องกับการยอมรับและประมวลผลข้อมูลของคุณ

แบบฟอร์มแสดงความคิดเห็นทางอีเมลทั่วไปที่มี mailto: แท็กจะเป็นกล่องข้อความไร้สัญชาติ - มันยอมรับการป้อนข้อมูลของคุณและโยนไปยังแอปพลิเคชันอีเมลของเวิร์กสเตชันของคุณโดยไม่ต้องเก็บข้อมูลใด ๆ


แบบฟอร์ม "ทิ้งที่อยู่อีเมลและข้อความของคุณและเราจะติดต่อคุณกลับไป" แบบฟอร์มนั้นก็ไร้สัญชาติเช่นกัน เมื่อคุณส่งแบบฟอร์มเซิร์ฟเวอร์ไม่สนใจว่าคุณได้รับมาจากที่ใดและเพียงคัดลอกข้อมูลไปยังรายการสิ่งที่ต้องทำในการบริการลูกค้าและลืมเกี่ยวกับมัน
StarWeaver
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.