Omer Baris KARAER

Başlığı görenler küçümseyebilir ama yapılan büyük bir hata var.Eğer kodunuzda çok fazla cross thread call işlemi yapıyorsak ve herhangi bir threadi belli bir işlemi bitirdikten sonra öldürmek istiyorsak aşağıdaki gibi yapabiliriz

…..

?View Code CSHARP
public class Class1
{
static void Main()
{
 
public bool ThreadCycle
 
Thread worker=new Thread(DoWork);
 
worker.start();
 
}
 
private void DoWork()
 
{
 
while (ThreadCycle)
 
{
 
Xwork();
 
Ywork();
 
zWork();
 
........
 
}
 
worker.Join();//threadi işlemlerini bitiresiye kadar beklet....
 
if(worker.isAlive)
 
worker.Abort();
 
}
}
Evet işlemi gerçekleştirdik ,ThreadCycle değişkeniyle oynadık ,programımızı kapatmak istiyoruz veya threadi bitirmek istiyoruz Abort() metodunu çağırdık ve thread öldü….. mü acaba.Bu işlemle threadin ölüp ölmediginden emin olamazsınız.Bunun yerine yapılması gereken Thread.Abort() metodunun fırlatmış oldugu exception dan yararlanmaktır.ThreadAbortException Abort() metodu çağrıldığı anda fırlatılır.Kodumuzu şu şekilde revize edersek istediğimiz elde etmiş olacağız
Yanii
?View Code CSHARP
try
 
{
 
while(ThreadCycle)
 
{
 
DoWork();.....
 
}
 
}
 
catch(ThreadAbortException e)
 
{
 
MessageBox.Show("Thread öldü...");
 
}

herkese kolay gelsin…

[c#]

XElement Site = new XElement("Sites", 
 
from site in sites 
 
orderby site.Id //descending 
 
select new XElement("Site", 
 
new XAttribute("Name", site.Name), 
 
new XAttribute("Id", site.Id), 
 
new XAttribute("Address", site.Address))); 
 
XDocument xdoc = new XDocument(); 
 
xdoc.Add(Site);
 
xdoc.Save(
"bilyaz.xml");

Session State

State management konumuzun sonuncusu ve çok başvurulan bir metod olan Session State makalemizle yine karşınızdayız.
        Hatırlayacağınız  gibi    daha önce anlattığımız Query String,View State,Cookie gibi metodların kullanım alanlarında bazı sınırlamalar mevcuttu.Peki ya bizim uygulamamızda daha spesifik ve kompleks verileri saklamamız gerekirse ne olacak veya güvenlik unsuru ön plandaysa hangi yöntemi kullanmamız gerekecek?Bir data objesini saklayıp başka bir sayfaya iletmemiz gerekirse ne yapmamız gerekecek?İşte bu durumda ASP.NET ‘in en önemli özelliklerinden biri olan Session State özelliğini kullanarak sorunumuzu gidereceğiz.
Session State  özelliğinin yönetimi ASP.NET’in dikkat  çeken yegane taraflarından biridir.Bu özellik herhangi türden bir veriyi sunucudaki hafıza üzerinde saklamamıza olanak sağlar.Bilgi kullanıcıya gönderilmediğinden ve her oturumun spesifik olması nedeniyle korunmuştur.Sunucuya erişim sağlayan her kullanıcının farklı bir oturumu ve sunucuda saklanan farklı bir oturum bilgisi mevcuttur.
ASP.NET her oturumu(session) 120-bitle kimlikler ve bu değeri yaratmak için kendine ait patentli bir algoritma kullanır.Yaratılan oturum değeri(Session_ID) her kullanıcı için tektir ve zararlı erişimcilerin ulaşıp çözemeyeceği kadar rastgele yaratılmıştır.
Uygulamanın sunulabilmesi için kullanıcının her istenildiğinde doğru oturum değeriyle erişim sağlaması gerekecektir.Bunu yapmanın 2 yolu vardır.
1-)Cookie Kullanarak: Bu yöntemde session_Id ,session collection kullanıldığında  “ASP.NET Session_ID “isimli, özel ve otomatik olarak yaratılmış bir cookie ye iletilir.Bu yöntem default olarak kullanılır ve ASP’ den gelen bir gelenektir.
2-)Özel URL kullanarak: Bu yöntemde Session_ID özel olarak yaratılmış URL ler kullanılarak iletilir.Bu yöntem ASP.NET’in yeni yaklaşımıdır böylece cookielere izin vermeyen kullanıcılar içinde session stateler kullanılabilir.
Her yöntemde olduğu gibi Session State metodunda da unutulmaması gereken bir yön vardır.Her ne kadar da küçük bir veri saklanacak olsa da çok kullanıcılı uygulamalarda çabuk altından kalkılamaycak boyutlara gelebilir.Sessionların dikkatsiz kullanımı çoklu kullanımları engelleyen en büyük sorunlardan biridir.
Session Stateler System.Web.SessionState.HttpSessionState sınıfına erişilerek kullanılabilirler.Kullanım syntaxı ViewState le aşağı yukarı aynıdır.Mesela bir dataset objesini saklamak istersek aşağıdaki gibi kodlamamız gerekir.
Session[“dsBilgi”]=dsBilgi;
ve değiştirebilmek işini de aşağıdaki şekildeki bir dönşümle yapabiliriz.
dsBilgi=(DataSet)Session[“dsBilgi”];
.Bir örnekle Session State kullanımını açıklamadan önce HttpSessionState sınıfının bazı methodlarının ne işe yaradığını açıklamadakta fayda var,zira Session State özelliğini kullanırken bu methodlara da ihtiyaç duyabilirsiniz.
Count            :Kullanılan Sessiondaki item sayısını verir.
IsCookieless:Yukarıda açıklanan Cookie metodunun mu özel URL metodunun mu kullanılacağını ayarlar.
TimeOut        :Yürürlükteki session bittikten sonra yeni bir request almadan beklenecek süreyi belirler ve programla ayarlanabilir bir özelliktir.
Abandon()     :Kullanılan session ı iptal eder ve memory de kapladığı alanı hemen siler.Bilgiler silindikten sonra hafızayı boşaltabilmek için iyi bir yöntemdir.
Clear             :Session ın içini boşalttır ama ID sini silmez.
Bir örnekle konumuzu pekiştirelim…….
 

private void Page_Load(object sender, System.EventArgs e)
{
if(!this.IsPostBack)
{
Makine birinci=new Makine(“Arçelik”,”A990 Modeli”,600);
Makine ikinci =new Makine(“Beko”,”TFG2000 Modeli”,450);
Makine ucuncu=new Makine(“Ariston”,”WQ400 Modeli”,875);

Session["Makine1"]=birinci;
Session["Makine2"]=ikinci;
Session["Makine3"]=ucuncu;

LstItems.Items.Add(birinci.ISIM);
LstItems.Items.Add(ikinci.ISIM);
LstItems.Items.Add(ucuncu.ISIM);
}                 

LblBilgi.Text=”Session_ID:  “+Session.SessionID;
LblBilgi.Text+=”<br/>Nesne Sayısı:    “+Session.Count.ToString();
LblBilgi.Text+=”<br/>Mode:  “+Session.Mode.ToString();
LblBilgi.Text+=”<br/>IsCookieless:    “+Session.IsCookieless.ToString();
LblBilgi.Text+=”<br/>Is New: “+Session.IsNewSession.ToString();
LblBilgi.Text+=”<br/>TimeOut:    “+Session.Timeout.ToString();
}  
private void Button1_Click(object sender, System.EventArgs e)
{

if(LstItems.SelectedIndex==-1)
{
LblAyrinti.Text=”Lütfen bir ürün seçiniz!”;
}
else
{
string key=”Makine”+(LstItems.SelectedIndex+1).ToString();
Makine eleman=(Makine)Session[key];
LblAyrinti.Text=”İsim:  “+eleman.ISIM;
LblAyrinti.Text+=”<br/>Model:    “+eleman.ACIKLAMA;
LblAyrinti.Text+=”<br/>Fiyat:    “+eleman.FIYAT.ToString()+” YTL”;
}

    }
}
}

 

 
Yukarıdaki örneğimiz çamaşır makinemizin isimlerini, üretici açıklamalarını ve fiyatlarını tutan bazı data nesnelerini Session da nasıl tutulacağını gösterir.
Web programcılarının düştüğü bir hatayı belirtmek gerekir.Session State metodu birkaç kullanıcılı uygulamalarda  sorunsuz çalışacak ve programcıyı mutlu edecektir fakat kullanıcı sayısı arttıkça yavaşlama ve sorunlar başlayacaktır.Çok kullanıcılı uygulamalar için uygun olan caching metodunu da ileriki zamanlarda anlatacağız.Şimdi biraz Session State ‘in web.config(.NET için Solution Explorer dan erişilebilir) dosyasından ayarlanabilir metodlarından bahsedelim.
 

<?xml version=”1.0″ encoding=”utf-8″ ?>
<configuration>
<system.web>
.
.
<sessionState
mode=”InProc”
stateConnectionString=”tcpip=127.0.0.1:42424″
sqlConnectionString=”data source=127.0.0.1_u84 ?rusted_Connection=yes”
cookieless=”UseCookies” cookieName=”ASP.NET_SessionId”
regenerateExpiredSessionId=”false”
timeout=”20″
SqlConnectionString=”tcpip=127.01.01:42424”
StateNetworkTimeOut=”100”
SqlConnectionString=”datasource=127.01.01:;IntegratedSecurity=SSPI”
SqlCommandTimeOut=”30” allowCustomSqlDatabase=”false”
CustomProvider=””
/>
</system.web>
</configuration>

 
Şimdi bahsettiğimiz özellikleri açıklayalım…

*Cookieless: Cookiless ayarını HttpcookieMode enumarationlarına göre yapabil
irsiniz.
Değerler aşağıdaki gibidir..
UseCookies: Tarayıcı cookie leri desteklemese bile cookie kullanmaya ayarlar ve sonuç olarak Session_Id değeri kaybedilir ve her requestte yeni bir değer yaratılır.
UseUri: Cookieler başka ayarlara bakılmaksızın deaktivite edilir yani kullanılmaz.Cookie yerine Session_Id url de saklanır.
UseDeviceProfile: Bu moda ASP.NET BrowserCapabilities nesnesini inceleyerek bilgisayarınızın cookieye uygun olup olmadığına karar verir fakat cookie kullanımına izin verilip verilmediğini araştırmaz.
AutoDetect: Bu modda ASP.NET bir cookie yi çalıştırmaya kalkışarak tarayıcının cookie için uygun olup olmadığına bakar ve cookiless modun çalışmasına karar verir.
*TimeOut: Bu özellik Sessionın en önemli eksikliklerinden biri için kullanılır.ASP.NET te dakikaların sunucu ve sayfa üzerindeki bilgiler için hayati önemi vardır.İdeal olarak zaman aralığı sunucunun kullanıcı programı kapattıktan sonra veriyi güncelleyecek kadar kısa ve kullanıcı session ı durdurup bilgiyi kaybetmeden devam edebileceği uzun olmalıdır.Bu değeri TimeOut özelliğiyle ayarlanabilir.
Session.Timeout=10;
*Mode: Bu ayar da session state kullanılırken hangi özel hizmetin kullanılacğına karar verir. Aşağıdaki 5 bölüm değişik session model arını belirtir.
InProc: Default değerdir.ASP.NET teki worker threadler gibi aynı işlemlerde saklanan bilgilerin en yüksek performansla getirilmesini sağlar(Dayanıklılık zaafları vardır.)
Not: Eğer birden fazla server kullanacaksanız out-of-service veya SqlServer state servislerini kullanmanız gerekir.
Off: Adından da anlaşılabileceği gibi session state ayarlarını deaktivite eder.
StateServer: Bu ayarla birlikte ASP.NET state management için Windows servislerini kullanır.Bu servis aynı web sunucusunu kullanır fakat bu ASP.NET işlemlerinin dışındadır ve ASP.NET işlemleri yeniden başlatılmak gerekirse bunlara temel seviyede güvenlik sağlar.Bu ayarlamayı kullanmak istediğinizde  SqlConnectionString için bir değer belirlemeniz gerekecek ve bu değer sizin tcp/ipadresinizle ASP.NET’in kullandığı Port adresini belirleyacaktir.Bu da StateServer ı başka bir bilgisayardan sunmanıza olanak sağlayacaktır.           
SqlServer: Bu ayarlama ASP.NET’in session bilgilerini saklamak için bir Sql vertabanı kullanmasını sağlar.Bu yöntem en esnek ve en yavaş durum saklama yöntemidir.State Management ta bu ayarlamayı yapabilmeniz için bilgisayarınızda bir Sql Server ın yüklü olması gerekir.SqlConnectionString özelliğini ayarlarken mutlaka bir data source bi ID ve de password değerlerini belirtmeniz gerekmektedir.Aslında Session veritabanlarının adı genelde ASPState dir.Bunun için veritabanının ismi SqlConnectionString de belirtilmemiştir.Eğer siz başka isimde bir veritabanı kullanmak isterseniz SqlConnectionStringe “InıtıalCatalog=Veritabananıismi” yazarak başka bir veritabanı balirleyebilirsiniz.
Custom: Custom özelliğini kullanmak isterseniz ilk önce CustomProvider özelliğini belirtmeniz gerekecektir.CustomProvider özelliği App_Code dizinindeki veya Bin dosyanızdaki derlenmiş assembly dosyanızı işaret eder.Bu özellik düşük düzey bir ayardır ve kullanımına dikkat edilmesi gereklidir.Bu ayarlama güvenlik dayanıklılık ve ölşçülebilirlik açısından önemlidir.

 
Application State:
 
Application State özelliği her kullanıcı tarafından erişilebilen global nesneler saklamamıza olnak sağlar.Application State System.Web.HttpApplicationState sınıfından türemiştir ve Session State le büyük benzerlikler gösterir.Aynı nesnelere sahiptir,bilgiyi sunucudan alır,aynı syntaxı kullanır.Application Stat ele yapılan en genel uygulama kaç tane session yaratıldığını ve  sayfanın kaç defa çağrıldığını tutan sayaç uygulamalarıdır.
 

   private void Page_Load(object sender, System.EventArgs e)
{
int say=(int)Application["SayacKur"];
say++;
Application["SayacKur"]=say;
LblSayac.Text=say.ToString();
}

 
Application State yukarıdaki yapıyla çok fazla kullanılmaz.Nedeni de aynı anda yapılan 2 farklı kullanıcı isteği ayrı ayrı sayılmaz,tek sayılır .Bu da bir requestin sayılmaması anlamına gelir.Bu sorunu önlemek için Lock() ve Unlock() metodları kullanılmalıdır.
 

private void Page_Load(object sender, System.EventArgs e)
{
Application.Lock();
int say=(int)Application["SayacKur"];
say++;
Application["SayacKur"]=say;
Application.UnLock();
LblSayac.Text=say.ToString();
}

 
   Bu metodlar kullanıldığı zaman başka kullanıcılar tarafından application koleksiyon serbest bırakılmadan sayfaya erişim sağlanamaz.Bu durum performansı inanılmaz şekilde olumsuz etkiler.
Application State konumuzla State Management konumuzu bitirmiş oluyoruz.İleriki konularımızda görüşmek üzere
2.1   Query String:

QueryString metoduyla her internet kullanıcısı günde defalarca karşı karşıya kalmaktadır.Query String metodu daha çok arama motorlarında kullanılmıştır.Örnek olarak  google ve Yahoo arama motorları verilebilir.
            Query String metodunda bilgi adından da anlaşılacağı üzere string katarlar olarak depolanmaktadır.(Örn: www.google.com/search?q=Eskişehir Osmangazi Üniversitesi) Bu metodun tercih sebebi serverda ve sayfada fazla yük yapmamasıdır.Yük olmamasına rağmen kullanımında önemli bazı kısıtlamalar mevcuttur.

 

Her internet tarayıcısı URL’sinin uzunluğunu sınırlamıştır.Bu sebepten dolayı URL’ye çok fazla bir bilgi girilemez dahası tarayıcılar arası uyumu gözetmek zorunda kalabilirsiniz.

Bu veri her kullanıcıya ve online olan herkesin ulaşımına açıktır.Bu yüzden de dış kullanıcı değiştirmek isteyebilir .Değişirse programınız bunun ne olduğunu anlayamaz ve hata oluşur. Kullanım amacı buna göre seçilmelidir

Dikkat edilmesi gereken en önemli özellikleriden biri de legal karakter içermesi gerekliliğidir.Komplex karakterler kullanılamaz.

*** Query String metodu view state gibi değildir tamamiyle erişilebilir.Bu yüzden  gizli olması gereken veriler için kullanmayın ya da şifreleyin
 

Bir örnek vermek gerekirse; düşünün ki bir e-ticeret siteniz var kullanıcınız için ürün ayrıntılarını başka bir sayfada gösteriyorsunuz.Ürünün ID sini özelliklerini Query Stringle iletelim.İlkin aşağıdaki sayfa dizaynını gerçekleştirelim.

 
 

Sayfamız ürünleri sıralamak için ListBox(LstItems) ,tüm ayrıntıyı seçebilmek için bir  CheckBox (ChckFull) ve ayrıntıyı görüntüleyebilmek için de bir butona(cmdView) sahiptir
İlk Sayfanın kodu şöyle olmalıdır.

 

public class WebForm1 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.Button cmdView;
protected System.Web.UI.WebControls.ListBox LstItems;
protected System.Web.UI.WebControls.Label LblError;
protected System.Web.UI.WebControls.CheckBox ChckFull;
private string contents;

protected void Page_Load(object sender, System.EventArgs e)
{
LstItems.Items.Add("Beko TFG2000 Çamaşır Makinesi");
LstItems.Items.Add("Bosch E210 Çamaşır Makinesi");
LstItems.Items.Add("Ariston WQ400 Çamaşır Makinesi");
LstItems.Items.Add("Arçelik A990 Çamaşır Makinesi");
LstItems.Items.Add("Lesita L365 Çamaşır Makinesi");
}

            #region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: This call is required by the ASP.NET Web Form Designer.
//
InitializeComponent();
base.OnInit(e);
}

private void InitializeComponent()
{   
this.cmdView.Click += new System.EventHandler(this.cmdView_Click);
this.Load += new System.EventHandler(this.Page_Load);

            }
#endregion

      private void cmdView_Click(object sender, System.EventArgs e)
{
if(LstItems.SelectedIndex==-1)
{
LblError.Text="Bir Ürün Seçmelisiniz…";
}
else
{
string url="NewPage.aspx?";
url+="Item= "+LstItems.SelectedItem.Text+"&";
url+="Mode= "+ChckFull.Checked.ToString();
Response.Redirect(url);
}
}                

}
}

 

 

Görebileceğiniz gibi Query Stringe geçerli olmayan karakter bilgileri gönderdik mesela boşluk karakteri,“Ç”harfi hepsi için ASP.NET in bir şifreleme yöntemi vardır.Boşluk için %20  ‘Ç’ karakteri için %c3%87 …..
Bilgiyi alan sayfa bu stringi sorun çıkmadan  orijinal haliyle alır

 

 

2.sayfanın oluşabilmesi için aşağıdaki kodu oluşturmak gereklidir

 

public class NewPage :System.Web.UI.Page
{
protected System.Web.UI.WebControls.Label LblAyrıntı;
protected System.Web.UI.HtmlControls.HtmlGenericControl FONT1;
protected System.Web.UI.WebControls.Label LblInfo;

private void Page_Load(object sender, System.EventArgs e)
{
LblAyrıntı.Visible=false;
LblInfo.Text="Item"+Request.QueryString["Item"];
LblInfo.Text+="<br/>Tüm Ayrıntı:";
LblInfo.Text+=Request.QueryString["Mode"];
if(Request.QueryString["Mode"]=="true")
{LblAyrıntı.Visible=true;
}

      }
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{

InitializeComponent();
base.OnInit(e);
}

private void InitializeComponent()
{   
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
}

 
 

2.2 Cookies:

Cookiler(Çerez) daha sonra kullanmak amacıyla veri saklamanın diğer bir basit yoludur.Cookiler, esasında kullanıcının hard diskinde oluşturulan küçük text dosyalarıdır.Bu küçük text dosyalarının saklandığı yer tarayıcınızın kurulu olduğu alana göre değişme gösterebilir.Sayfalar arası veri paylaşımı için kullanılır.Projedeki her sayfa tarafından ismi bilinmek suretiyle kolayca okunabilir ve uzun dönem bilgi saklamaya elverişlidir.Bu kadar işlevinin yanı sıra pek çok dezavantajları da vardır.Basit stringleri saklayabilir(QueryString gibi).Çok kolay erişilebilir ve okunabilir bu da ciddi bir güvenlik sorunudur.Ulaşılması istenmeyen özel bilgiler cookiede saklanmamalıdır.Cookide önemli veri saklamamanın gerekliliğinin başka bir nedeni de cookienin saklandığı yerin kullanıcı hard diski olmasıdır ,kullanıcı dosyayı herhangi bir nedenle ortadan kaldırabilir veya tarayıcısını cookie kullanımına kapatabilir.Bu da uygulamada hataya neden olur.Bütün bu nedenlerden dolayı cookieler comleks stringler, gizli bilgiler ve fazla miktar bilgiler için iyi bir yöntem değildir.
            Cookie kullanmak istiyorsanız bütün yukarıdaki durumları göz önünde bulundurmak zorundasınız ve ayarlarınızı cookilere her zaman erişilebilir mantığıyla yapmamalısınız.Bu nedenle cookieleri daha çok kullanıcının bir önceki ziyaretinde neyle ilgilendiği,kaçıncı ziyareti olduğu,kullandığı font boyutu veya e-mail adresinin ne olduğu  gibi onunla ilgili tecrübe kazanabileceğiniz bilgilere erişebilmek için kullanmak en iyi yöntem olacaktır.
            Bir cookie nesnesi oluşturmak için Request ve Response nesnelerini kullanabiliriz.Request cookieye erişimi ,Response nesnesi de cookieyi değiştirmemizi sağlar.Cookieler uygulama açıldığında yaratılır ve default olarak ömürleri tarayıcı kapanasıya kadardır ama ömürleri ayarlanabilir(Cookies.Expires).
Bütün anlattıklarımızı bir örnekle açıklamaya çalışalım.Aşağıdaki kod bir kullanıcının siteyi ziyaretinde bir cookie yaratmasını istiyor ve sayfa yenilenince kullanıcıyı tanıyor.

 

public class WebForm1 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.TextBox TxtName;
protected System.Web.UI.WebControls.Button cmdStore;
protected System.Web.UI.WebControls.Label LblBilgi;

private void Page_Load(object sender, System.EventArgs e)
{
HttpCookie cookie=Request.Cookies["Preferences"];

  if(cookie==null)//Cookie yaratılmamışsa değeri NULL’dur
{
LblBilgi.Text="<b>Hoşgeldin Ziyaretçi<b/>";
}
else
{
LblBilgi.Text="<b>Cookie Bulundu<b/><br/><br/>";
LblBilgi.Text="Hoşgeldin     "+cookie["Name"];
}

       }

private void InitializeComponent()
{
this.cmdStore.Click += new System.EventHandler(this.cmdStore_Click);
}

private void cmdStore_Click(object sender, System.EventArgs e)
{
HttpCookie cookie=Request.Cookies["Preferences"];
if(cookie==null)
{
cookie=new HttpCookie("Preferences");
}
cookie["Name"]=TxtName.Text;
cookie.Expires=DateTime.Now.AddMonths(2);//Cookie 2 ay süreyle saklanacak…
Response.Cookies.Add(cookie);

LblBilgi.Text="<b>Cookie Yaratıldı…<b/><br/><br/>";
LblBilgi.Text="Yeni Kullanıcı "+cookie["Name"];

}  
}
}

 

 

 

Yukarıdaki kodun oluşturduğu uygulama resimdeki şekildedir.Sayfayı daha önce çalıştırdığım için bilgisayarımda cookie yaratılmıştı.Siz de yarattıktan sonra manuel olarak cookieyi silin,sayfayı çalıştırın sayfadaki yazınız değişecek. 3. makalemzide görüşmek üzere…..

 

Bilişim ve yazılım dünyasına öncü kaynaklardan biri haline getirmek istediğimiz sitemizde ilk makalemize asp.net bölümünde state management serisiyle başlıyoruz.
State management konusuna girmeden önce bir şeyi belirtmek sanırım yararlı olacaktır.Kullanıcı ile etkileşim halindeki bir web sitesi hazırlamanın temel şartlarından biri kullanıcının anlık bilgilerini (hangi sayfadan geldiği,kaçıncı kez geldiği,yönlendirilmiş olup olmadığı vs…)  request hızını da göz önüne alarak saklayabilmektir.Bu  işlem klasik bir  windows uygulamasında hafıza da yeterli olduğundan otomatik olarak yapılır.Sürekli çalışan bir masaüstü uygulamasında hafızadan özel bir bölge programın kullanması için ayrılmıştır.Profesyonal bir Asp.net web uygulaması da bu şekilde görülse de aslında olay biraz farklı işler.Web sayfanızı, servera bağlanarak istersiniz ve o size post edilir bu adımdan sonra sayfanın çalışması durmuştur eğer bundan sonra kullanıcı bilgilerini saklamak ve kullanmak istiyorsanız kullanabileceğiniz bazı yöntemler mevcuttur:

    View State
    Session State
    Application State
View State :

View State kontrolü kendisine verilen bilgiyi gizli bir alanda tutar.Bu bilgi hafızaya Base64 formatında bir karakter dizisi olarak yazılır ve her geri postalamada(postback) sunucuya getirilir ancak viewstate özelliği sunucu kontrolleriyle sınırlıdır.Yüklenen bilgi ya sizin tarafınızdan oluşturlan bir custom object veya basit bir bilgi türü olmak zorundadır.
Sayfadaki viewstate özelliği view state koleksiyonuyla işlem yapılmasını sağlar.Bu özellik SatteBag classının bir instancedır.Bu classa herhangi bir şey eklemek veya çıkarmak istediğinizde belli bir syntax kullanmanız gerekmektedir.

 

//this anahtar sözcüğü görüntülenen sayfanın nesnesine başvurur.
this.viewstate[“sayac”]=1;
int Sayac;
Sayac=this.ViewState["sayac"];
LblGoster.Text=Sayac.ToString();   //Sonuç 1 olarak görünecektir

 

yukarıdaki kodu yazdığımızda belirlenmiş olan sayactır.Eğer daha önce sayac isminde bir öğe yoksa bu kaydedilir varsa da yenisi üstüne yazılır.Alınan değeri bir yerde kullanmanız gerekiyorsa değerin türünü belirtmeniz gerekmektedir.Çünkü view state collection alınan değeri generic(markasız,türsüz) tutar.

 

int Sayac;//int türünde değişken yaratılır
Sayac=(int)this.ViewState[“sayac”];// int türündeki değer atanır

 

Yukarıda da belirtildiği gibi viewstate özelleğinin tuttuğu değer alenen görülebilecek şekilde dizayn edilmiştir.Hiçbir şekilde şifreleme veya daha başka bir işlem uygulan-
mamıştır.Sisteminize sızmak istiyen art niyetli kişilerin eriişmine açıktır.Bunu önlemek
sistem güvenliği açısından bir mecburiyet olduğuna göre önlem 2 şekilde alınabilir
1-)Viewstate değerinin hash code olmasını sağlayarak yapılması;
Asp.net viewstate değerini alarak daha önceden belirlenmiş gizli bir key value sayesinde  karıştırma algoritmasına tabii tutar.Algoritma kısa bir bilgi katarı oluşturur ve bu bölüm değerin sonuna eklenir ve sayfa ne zaman geri postalanırsa Asp.net bu bilgiyi alır ve yeniden hesaplayarak viewstate de saklanan değerle aynı olup olmadığına bakar değer aynı değilse işlem sona erer.Asp.net bilginin tamamını istemciye yollamayı reddeder.Bu bilgiyi hash etme aslında Asp.netin default olarak gerçekleştirdiği bir işlemdir .Programcı tarafından gerekli görülmezse atlanabilir.(Yeni Serverlarda çıkan problemlerden kaçınmak için)
İptal işlemi web.config dosyasındaki enableViewStateMac=”False” denilerek yapılabilir.
2-)Sorun birden çok serverda da aynı gizli key value değeri kullanılarak aşılabilir (Bu konu detaylı şekilde işlenmesi gerekliliğinden dolayı başka bir makale konusu olarak görülmüştür.)
Aşağıdaki örnekle konuyu bitiriyoruz.

 

a

 

public partial class _Default : System.Web.UI.Page
{
private string icerik;
protected void Page_Load(object sender, EventArgs e)
{
if (this.IsPostBack)//Sayfanın geri yüklenen olup olmadığını kontrol eder
{
icerik = (string)ViewState["icerik"];
}
}
protected void Page_PreRender(object sender, EventArgs e)
{
ViewState["icerik"] = icerik;
}

    protected void CmdKaydet_Click(object sender, EventArgs e)
{
//TextBoxa yazılan değeri üye değişkene atayalım
icerik = TxtGoster.Text;
//İçeriğin saklandığının anlaşılması için TextBox içeriğini temizleyelim
TxtGoster.Text = "";
}
protected void CmdBaglan_Click(object sender, EventArgs e)
{
TxtGoster.Text = icerik;
}
}

 

Bir bilgiyi web sitesinde saklarken masaüstü uygulamalardaki kadar belleğe sahip olmadığımızdan dolayı gerekli olmayan hiçbir şeyi tutmamaya gayret göstermek gereklidir.Çok büyük bilgilerin saklanması gönderilen son sayfanın gereksiz bilgilerle şişmesine ve  performans azalmasına  neden olacaktır .Bir dahaki makalede session state konusunda görüşmek üzere………

 
 
 
© 2010 bilyaz.com , Programlama Makaleleri, Yazılım Makaleleri , Örnek Kodlar , Eğitim Videoları , C#,ASP.NET,SQL,PHP Suffusion WordPress theme by Sayontan Sinha