Devletsiz ve vatansız arasındaki fark nedir?


86

MVC'deki kitaplar ve belgeler Devletli ve Vatansız terimlerini kullanmaya dayanıyor. Dürüst olmak gerekirse, bunun hakkında ne kitaplardan bahsettiğim fikrini alamıyorum. HTTP'nin durumsuz olduğunu ve ASP.NET MVC microsoft ile birlikte devam ettiğini söylemek yerine, her iki durumu da anlamaya bir örnek vermezler. Neyin devletli olduğunu ve niçin devletli ve aynı şeysiz olduğunu anlayamadığım için bazı temel bilgileri özlüyorum.

Düğme veya metin kutusu gibi bir denetimden bahseden basit ve kısa bir örnek, sanırım anlayışı basitleştirebilir.

Yanıtlar:


40

Vatansızlık, HTTP'nin devletler için destek sağlamadığı anlamına gelir; Örneğin, bir kullanıcı giriş yaptıysa veya başka bir şey yaptıysa saklayamazsınız.

En yaygın çözüm, bu sorunun üstesinden gelmek için oturumları kullanmaktır. Bu, her cevap veya istekte bir oturum tanımlayıcısı ekleyebilmeniz gerektiği anlamına gelir. Bu, bir oturum çerezi oluşturarak veya oturum tanımlayıcısını tüm bağlantılara dahil ederek yapılır.

WebForms, bunları şeffaf hale getirmeye çalışır (ViewState kullanarak), MVC sizi elle işlemeye zorlar.

Örnekte, Düğmeler ve Metin Kutularından bahsettiniz. Durumlarını korumalarına izin vermenin en kolay yolu, tüm sayfayı geri göndermekten vazgeçmektir. MVC, ajax (jQuery aracılığıyla) için mükemmel destek aldı ve şu anki sayfada bir şeyler yapmak istiyorsanız, ajax kullanmanızı öneririm.


3
bu, bir web sitesine giriş yapmışsam, ziyaret ettiğim her sayfa, içeriği oturum tanımlayıcısı veya bir oturum çerezi aracılığıyla oluşturmadan önce yalnızca kimlik doğrulaması olup olmadığını kontrol eder.
Pankaj Upadhyay

3
Evet doğru.
jgauffin

vatansızlık daha mı iyi, yoksa daha mı kötü?
Lucas - Better Coding Academy,

1
@ think123: Durumu yönetmek zorunda olmadığınızdan daha iyi performans gösterir (yani yük dengeleme vb. çok daha kolaydır). Yapay bir durumu yönetmek zorunda olduğunuzdan bu yana daha karmaşık bir durum.
jgauffin

5
@jgauffin: performant burada yanlış kelime. Vatansızlık daha az performans gösterir çünkü durumu önbelleğe alma fırsatınız yoktur ve tekrar tekrar bakmak zorunda kalmazsınız. Nedir daha ölçeklenebilir ; Yük dengelemenin devreye girdiği yer burasıdır ve ölçeklenebilirlikteki kazançlar sisteminiz yeterince büyüdüğünde performanstaki kayıpları dengeleyebilir.
Mason Wheeler

108

Vatansızlık - Program tarafından tutulan hafıza (durum) yok

Durum bilgisi - Programın hafızası var (durum)

Devlet kavramını göstermek için, durumlu ve durumsuz olan bir işlevi tanımlayacağım

vatansız

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

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

Durumsal

//The state is maintained by the function

private int _number = 0; //initially zero 

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

Diğerlerinin dediği gibi http kendiliğinden vatansız. Öyleyse devlet uygulamalarınıza dahil edilmelidir.

Web üzerinden, bir sunucu işlemiyle iletişim kuran bir istemci tarayıcınızın olduğu bir istek hayal edin. Vatansız http protokolü üzerinden durumunu korumak için tarayıcı genellikle her istek üzerine sunucuya bir oturum tanımlayıcı gönderir. Her istek için sunucu "ah, bu adam" gibi olacak. Durum bilgisi daha sonra sunucu tarafı hafızasında veya bu oturum kimliğini temel alan bir veritabanında aranabilir.

Tamamen vatansız bir ortamda bu oturum kimliğine ihtiyacınız olmaz. Her istek, sunucunun işlemesi gereken tüm bilgileri içerir. Ancak, birçok uygulamanın belirli bir içeriği görüntülemek veya bir kullanıcının ne yaptığını takip etmek için bir oturumun kimliğinin doğrulanıp doğrulanmadığını takip etmek için durumu koruması gerekir. Her istek için tel üzerinden kullanıcı kimlik bilgileri göndermek istemezsiniz.


hızlı soru: oturum kimliği başka bir kullanıcı tarafından kullanılırsa (yani çalındıysa), sunucunun bunun başka biri olduğu hakkında hiçbir fikri olmaz mı?
mihai

4
Bu doğru. Https veya httponly çerezleri kullanmak gibi bir kullanıcının kimliğini korumanın yolları vardır. Ancak, bir kullanıcının bilgisayarı tehlikeye girerse, saldırgan sunucuyu kendileri olduğunu düşünerek kandırabilir.
kodlayıcı,

2
Net ve gevrek bir kod örneği için +1. Artık çoğu karmaşık BT terimlerinin ancak bağlamda anlaşılabileceğine inandım.
Sebastian,

Bir oturum kimliğinin çalınması olasılığı, dikkatli olmanızın bir nedenidir ve bir CMS veya OAuth gibi uygulamalar bunu daha da zorlaştırmanın yollarını oluşturur.
Elin

4
Her istek için sunucu "ah, bu adam" gibi olacak - daha iyi gördüğüm diğer her örnekte
Rafael Eyng

69

vatansızlık geçmişin hatıraları olmadığı anlamına gelir. Her işlem ilk defa yapılmış gibi yapılıyor.

durum, geçmişin hafızası olduğu anlamına gelir. Önceki işlemler hatırlanır ve geçerli işlemi etkileyebilir.


9
Bu cevap verilmiş olmalı. Bu, şu ana kadarki en açık ve en kesin cevaptır.
Mawg

3
Basit ve doğru.
Ivan Ivković

2
Farkı zaten bilen herkes için doğrudur.
Rafael Eyng

3

Benim düşünceme göre, ASP.NET (durum bilgisi olan) ve ASP.NET-MVC (durumsuz) arasındaki fark, ilk olarak sunucu tarafı denetimleri sağlayan ve diğerinin sağlamadığı gerçeğiyle izole edilebilir.

ASP.NET web formları yaklaşımının, olay modeline dayalı modelde kullanılan eski VB ve VC ++ programcılarının, aynı olay modeli paradigmasını izleyerek, aynı program model paradigmasını izleyerek hızlı bir şekilde web programlamasını öğrenme yolunda ilerlemeye yönelik olduğunu fark etmek önemlidir. Bir düğme ve işte bir olayı tetiklersiniz! Şimdi tek yapmanız gereken, kodunuzu olay işleyicisine yazmak. Bu nedenle, ASP.NET'in her bir tur gezisinde sunucu tarafı denetimlerinin durumunu izlemek için görünüm durumu ve geri göndermeler gibi kavramları olması gerekiyordu.

ASP.NET-MVC, ancak sunucu tarafı denetimleri kullanmaz, bu nedenle durumu korumasına gerek kalmaz. MVC modeli, problem alanını üç bölüme ayırır, böylece veriler müşteriye kolay bir şekilde iletilir.

Özetle, sunucu tarafı denetimleri, durumlarını ve durumsuz olmaları bakımından farklı kılan şeylerdir.


1

@ Kodlayıcıya kesin cevap eklenmesi.

Devlet fikri önceki verileri hatırlamaktır .
Örneğin, sunucuda "A, B, C" ve "A" değerlerinin seçili olduğu bir liste kontrolü vardır. Liste istemci tarayıcısına gider. "B" yi seçtiniz. Ve sunucuya geri gönderin. Değerin değiştiğini nasıl bildin?

  • ASP.NET
    Microsoft, ASP.NET'te ViewState terimini kullanır . Geliştiriciler arasında bu konuda büyük bir yanlış anlaşılma var.
    ViewState, listedeki tüm başlangıç ​​durumunu tutar <input type="hidden" value="base64 encoded" />: "A, B, C" değerleri ve "A seçili" işareti.
    Sonra geri tarayıcı ile ViewState gönderir ve sunucuya "B seçildi". ASP.NET, listenin başlangıç ​​durumunu geri yükler ve yeni "B" seçimini uygular. Bu WinForms geliştiricilerini cezbetmek için yapıldı (@Ronald tarafından belirtildi). Web sunucusundaki değişiklikleri listelemek için abone olabilirsiniz listObject.Changed += OnChanged.

  • ASP.NET MVC
    ViewState ile sorun boyutu. Yıllar boyunca .NET geliştiricileri, her gidiş dönüş için 20 kontrol durumu gibi, kilobayt yararsız bilgiler aktarmaya zorlandı.
    Yeni yaklaşım, yalnızca yeni ve küçük "B" değeri göndermektir.
    Veya "A" 'dan "B"' ye olan değişimi izlemek istiyorsanız, bunu kendiniz uygulayın. Javascript kullanımı ve "Was A, Now B" gönderilmesi. Veya SQL Server'da ID'ye göre durumu kaydedin ve alın.

  • ASP.NET MVC ve ASP.NET , Kimlik Doğrulama ve Nakit Alma durumunu uygular. Bu yüzden ASP.NET MVC'nin durumsuz olduğunu söylemek doğru değil.
  • Hafıza cevapları belirtilen "hatırlanmasını" değil bilgisayar belleği anlamına gelir. Durum veriyi Dosya sistemi, SQL server veya Computer Memory 'de depolayarak uygulanabilir.

lütfen yapıcı olun ve eksi koymadan önce hatayı açıklayın
Artru

0

Durum bilgisi olan bir işlem, sistemin bazı durumlarını değiştirir veya gerektirir ve durumsuz bir işlem değildir.

Durum bilgisi içeren bir metin kutusu örneği, StackExchange'te önceden düzenlenmiş bir yorum olabilir - metin kutusunun önceki yorumunuzu görüntülemesi ve girişinizi kabul etmek ve işlemek için dahil olduğu gönderiyi bilmesi gerekir.

Mailto: tag içeren genel bir e-posta yorum formu, durumsuz bir metin kutusu olacaktır - girişinizi kabul eder ve herhangi bir bilgiyi tutmadan iş istasyonunuzun posta uygulamasına atar.


Tipik bir "e-posta adresinizi ve mesajınızı bırakın, size geri döneceğiz" formu da vatansızdır. Formu gönderdiğinizde, sunucu nereden aldığınızı önemsemez ve verileri yalnızca bazı müşteri hizmetleri yapılacaklar listesine kopyalar ve unutur.
StarWeaver
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.