Geliştirmekte olduğum bir projede kullanıcının linke tıklaması sonucu  popup pencere açıp; sonrasında popup içerisindeki dropdownlist’den bir değer alıp; kullanıcının butona tıklaması neticesinde popup’ın kapanması ve bir önceki yani geldiği sayfanın yenilenmesi gerekiyordu.
Örnek projemdeki mantık kısaca şöyle: Bir portal uygulaması ve bu portal içerisinde üyelerimiz mevcut. Üyelerin kendi alanları var ve bu alanlar için ziyaretçiler yorum yapabilmekteler. Eğer üyeler isterlerse kendi yönetim panellerinden bu yorum eklenebilme özelliğini aktif ya da pasif yapabilecekler.
Kısaca senaryo bu şekilde fakat biz burada fazla ayrıntısına girmeden sadece asıl olayın uygulanış biçimini göreceğiz. Bu yüzden veritabanı ile ilgili kısımlara burada değinmeyeceğim asıl işi yapan javascript kısmını anlatacağım.

Öncelikle iki sayfamız olacak. Birincisi üyelerin yönetim panelinin olduğu sayfa ikincisi de popup penceresini açtığımız sayfa.



UyePanel.aspx



<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
<!--
Evet belirlenen boyutlarda popup açmamızı sağlayan OpenDetailWindow isimli javascript
fonksiyonumuz. Burada window.open() yeni bir pencere açmamızı sağlayan metod.
Açılacak olan pencerenin ne şekilde açılması gerektiğini de metoda verdiğimiz parametrelerle
sağlamış oluyoruz. Yani kısacası popup dediğimiz olayı gerçekleştirecek fonksiyonumuzu
yazıyoruz. Ben sayfamı masterpage’den türettiğim için javascript fonksiyonumu Content1
arasında yazdım. Siz duruma göre <head></head> tag’ları arasına koyabilirsiniz.
-->

<script language="javascript" type="text/javascript">

function OpenDetailWindow() {
window.open('', 'detailwindow',
'toolbar=no,scrollbars=yes,resizable=yes,width=600,height=300');

}
</script>

</asp:Content>


<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
<!--
Burada bağlantımızın onclick özelliğine OpenDetailWindow isimli js fonksiyonumuzu
ve açılacak olan pencerenin ne şekilde açılması gerektiği şartını da target="detailwindow"
diyerek belirtiyoruz ve açmak istediğimiz Popup.aspx sayfasına yönlendiriyoruz.
“CommStatus” ise veritabanımda yorumların aktif/pasif olma durumunu tuttuğum alanım.
Bu değeri kod tarafından alıp literal üzerinde gösteriyorum.
-->

Yorumlar: <a href="../Popup.aspx" onclick="OpenDetailWindow()" target="detailwindow">
<asp:Literal ID="ltlAP" runat="server" Text='<%# Eval("CommStatus") %>'>
</asp:Literal></a>
</asp:Content>

Şimdi de Popup sayfamızı inceleyelim. Temel olarak projedeki popup sayfası da aşağıdaki gibiydi.



Popup.aspx



<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title></title>
<!--
Buradaki fonksiyonumuz işletildiğinde popup kapanacak ve popup'ın
gelmiş olduğu sayfa yenilenecektir.
-->

<script language="javascript" type="text/javascript">
function AppClose() {
self.close();
window.opener.location.reload();
}
</script>
</head>
<body>
<form id="form1" runat="server">
<center>
<font style="font-size: 9pt; font-weight:bold">Firmanız hakkında yapılan
yorumların yayınlanma durumunu seçiniz: </font>
<br />
<asp:DropDownList ID="ddlActivePassive" runat="server">
<asp:ListItem Value="0">Seçiniz</asp:ListItem>
<asp:ListItem Value="1">Aktif</asp:ListItem>
<asp:ListItem Value="2">Pasif</asp:ListItem>
</asp:DropDownList><br /><br />
<asp:Button ID="ButtonActivePassive" runat="server" Text="Güncelle"
onclick="ButtonActivePassive_Click" />
</center>
<!--
Şimdi asıl önemli olan noktalardan birisi de benim bu AppClose fonksiyonumu
butona tıklama sonrasında çalıştırmak isteyişim. Bu sebepten ötürü burada bir
label tanımlıyorum ve kod tarafından butona tıklama olayı gerçekleşince
label'a fonksiyonumu yazdırıyorum.
-->

<asp:Label ID="LabelJs" runat="server"></asp:Label>
</form>
</body>
</html>



Popup.aspx.cs



        protected void ButtonActivePassive_Click(object sender, EventArgs e)
{
CommActivePassiveStatus();
}

private void CommActivePassiveStatus()
{
if (ddlActivePassive.SelectedValue != "0")
{
/*
Bu kısımda eğer dropdownlist'den seçilen item "0" value değerine sahip değilse.
Seçilen aktif veya pasif değerlerini veritabanına gönderdiğimiz kod grubu olacak.
*/

/*
Ve bu işlem sonrasında label'ımıza AppClose fonksiyonumuzu <script></script>
tagları arasında yazdırıyoruz. İşin bu kısmı bana göre önemli çünkü çalışmasını
istediğimiz js fonksiyonunun hangi olay sonrasında başlamasını istiyorsak bunu
kod tarafından ayarlamış oluyoruz.
*/

LabelJs.Text = "<script>AppClose();</script>";
}

else
{
// Burda eğer dropdownlist'den seçilen value "0" ise alert ile mesajımızı verdiriyoruz.
// Tabi bunu ScriptManager sınıfı sayesinde yapıyoruz.

ScriptManager.RegisterStartupScript(Page, typeof(Page), "x", "alert('Lütfen seçim yapınız.')", true);
}
       }


Evet arkadaşlar uygulamamız bu şekilde. Buradaki yapıyı kendinize göre özelleştirip kullanabilirsiniz. Bu örneğimizde asp.net ile popup sayfası kapandıktan sonra bir önceki sayfanın yenilenmesini ve aynı zamanda da C# kod tarafından asp.net sayfalarına javascript fonksiyonlarının yazdırılmasını görmüş olduk.
Hepinize kolay gelsin. İyi çalışmalar.

 

kategoriler:  AspNet | JavaScript |

Her gün geçip gördüğüm sokakları bu şekilde seyretmek keyif verici gerçekten. Mehmet Kayalıoğlu arkadaşımızın hazırladığı Kadıköy'ü konu alan bu videosunu ve bu tarzdaki diğer videolarını sitesinde bulabilirsiniz.

 

etiketler:  geceistanbulkadikoysokak
kategoriler:  Genel |


27 Aralık 2010 saat: 11:58

Web uygulamaları geliştiren herkesin bir şekilde farklı amaçlar doğrultusunda bot yazma ihtiyacı olmuştur. Bot’lar kullanım amacına göre farklı algoritmalara sahip olabilmektedir. Söz gelimi arama motorlarının “örümcek”  olarak adlandırılan yazılımları aslında sayfaları indeksleme özelliğine sahip olan özel bot’lardır.
Biz bu uygulamamızda küçük çaplı bir bot yazmış olacağız. Amacımız bir web sitesinin sahip olduğu resim bağlantılarını ve mevcut olan linklerini toplamak.
Buradaki mantığı kısaca özetleyecek olursak HTTP protokolünü ve Html dilini kullanan sistemlere .NET yapısının bize sunmuş olduğu ilgili sınıflar aracılığı ile bağlantı kurup, verileri toplamak ve düzenleyip istediğimiz biçimdeki bilgilere dönüştürmek olarak ifade edebiliriz.
Burada toplanan bilgilerin düzenlenmesi aşamasında ilk akla gelen Regex (düzenli ifadeler) olacaktır. Fakat Regex ile bu işi yapmak gerçekten can sıkıcı olabilir. Her farklı yapı için kendi Regex fonksiyonlarımızı oluşturmak biraz zahmetli olacaktır.
Biz burada sıfırdan Regex tanımlamak yerine bu iş için yazılmış olan HtmlAgilityPack kütüphanesini kullanacağız. Bu tarz da ki kütüphaneleri çok özel bir durum olmadığı sürece kullanmanızı tavsiye ederim. Çünkü sizin sıfırdan uğraşarak yapmak istediğiniz birçok fonksiyon bu kütüphanelerin içerisinde daha da gelişmiş olarak zaten mevcut olmaktadır.
Html Parser dediğimiz olay ise aslında toplanan bilgilerin düzenlenmesi aşamasıdır. Biz HtmlAgilityPack kütüphanesi ile toplamış olduğumuz bilgileri istediğimiz biçimde ayrıştırmaya çalışacağız. Yani Html Parse etmiş olacağız.

Bu kısa giriş den sonra dilerseniz uygulamamıza geçebiliriz.
HtmlAgilityPack API’sinin güncel olan sürümünü http://htmlagilitypack.codeplex.com/releases/view/44954 adresinden indiriyoruz ve projemize referans olarak ekliyoruz.
Ben resim ve link bağlantılarını ayrı ayrı elde etmek için form tasarımını aşağıdaki gibi yaptım.

27_12_2010_a1.jpg

Resimleri Ayrıştır ve Linkleri Ayrıştır butonlar’ına tıkladığım zaman ilgili listboxlar da ilgili bağlantı adreslerini almak istiyorum.
Bunun için ilgili siteye öncelikle bir istek de bulunacağız sonrasında siteden gelen cevabı okuyup html formata çevireceğiz. Bu aşamadan sonra html parse işlemleri için HtmlAgilityPack api’sini kullanacağız.

Eklenmesi gereken namespace’ler

27_12_2010_a.jpg
Gerekli kodlarımız ve açıklamaları

28_12_2010_1.jpg

3_1_2011_1.jpg

28_12_2010_3.jpg

 Programımızı çalıştırdıkdan sonra ki ekran görüntümüz.

27_12_2010_a2.jpg

Dikkat ettiyseniz burada pek bir özel tanımlama yapmadan doğrudan tüm resim ve bağlantı linklerini aldık. Dilersek site içerisinde bulunan belli tanımlamalara ait bağlantıları isteğimize göre çekip alabiliriz. Örneğin ünlü Rock grubu Hypnogaja’nın http://www.hypnogaja.com/welcome.html sitesine bakalım. Grubun Here Comes The Rain Again adlı parçasını da dinlemenizi tavsiye ederim. Favori parçalardan biridir.
Burada html tarafında a tag’larına baktığımız zaman bir çoğunda onclick olayı olduğunu ve  onclick="window.open(this.href); return false;" şeklinde tanımlandığını görüyoruz. Bizimde ihtiyacımız olan şey ise bu şekilde tanımlı  linkleri almak olsun. Bunun için tek yapmamız gereken _htmlColl değişkenimize seçme işlemini nasıl yapacağını belirtmek.
İlgili satırı,
28_12_2010_4.jpg
şeklinde tanımladığımızda onclick olayı 'window.open(this.href); return false;' şeklinde olan linkleri çekmiş olacağız.

Hepinize Kolay Gelsin. İyi Çalışmalar.

HtmlParse.rar



kategoriler:  C# |

MSsql veritabanımızda okuma işlemleri yapacağımız zaman ExecuteReader ve ExecuteScalar metodlarını kulanıyoruz. Bu iki metodda sadece select sorgulamalarında çalışmaktadır. Insert, Delete, Update gibi sorgulama işlemlerinde ise ExecuteNonQuery metodunu kullanıyoruz.

ExecuteScalar metodu tek bir değer döndüren sorgulama işlemlerinde kullanılmaktadır. Örneğin belli bir alandaki sayısal değerlerin toplamını veya tablodaki kayıt sayısını veren sorgulamalar gibi.  sum, count, avg, max, min vs. 

ExecuteReader metodu ise select sorgusu ile çektiğimiz verileri satır ve sütün olarak herhangi bir veri kaynağına aktaracağımız durumlarda tercih edilmektedir. Aynı zamanda bu metod ile executescalar gibi tek bir değeri okuma işlemide yapılabilmektedir. Bunun içinde executereader metodunun CommandBehavior.SingleResult parametresi kullanılmaktadır.

Şimdi her ikiside tek bir değeri okuma işlemini gerçekleştiriyor o zaman hangisini kullanmalıyız ?
Yapacağımız örnek uygulamada da bunu öğrenmeye çalışacağız. Burada metodların çalışma zamanını tesbit etmek için Stopwatch sınıfını kullanıcaz. Normalde kodun çalışma zamanını belirlemek için DateTime.Now kullanarak kodun ilk çalışma zamanı ile son çalışma zamanı arasındaki farkı alıyorduk. Stopwatch sınıfı ile bunu daha hassas bir şekilde ölçmüş olacağız.

Örnek Uygulama için aşağıdaki gibi basit bir veritabanı tasarladım. Veritabanımızın ismi deneme ve kisiler tablosuna sahip.

12_11_2010_f1.jpg

File > New > Project  ve yeni bir Console Application oluşturuyoruz. Ve kodlarıda aşağıdaki gibi yazıyoruz. Ben gerekli kısımlara açıklama satırları ekledim.


using
System;

using System.Collections.Generic;

using System.Text;

using System.Data; // ekliyoruz.

using System.Data.SqlClient; // ekliyoruz.

using System.Diagnostics; // Stopwatch sınıfını kullanabilmek için bu namespace'i ekliyoruz.

 

namespace PerformansTest

{

    class Program

    {

        static void Main(string[] args)

        {

            /*ExecuteReader*/

            Stopwatch stpwch = new Stopwatch(); //stopwatch sınıfından stpwch isimli bir değişken oluşturduk.

 

            SqlConnection _con = new SqlConnection(@"Data Source=XP7\XPSEVENSQLSERVER;Initial Catalog=deneme;Integrated Security=True");

            SqlCommand _cmd = new SqlCommand("select*from kisiler", _con);

            _con.Open();

 

            stpwch.Start(); // stpwch değişkeninin ilk çalışma noktası burası.

            SqlDataReader _dr = _cmd.ExecuteReader(CommandBehavior.SingleResult);

            _dr.Read();

            stpwch.Stop(); // stpwch değişkeninin bitiş noktası burası. yani hangi kod aralığının çalışma zamanını kontrol edeceksek ilgili kodların üst ve alt satırlarında çalışma ve bitiş noktasını belirtiyoruz.

 

            Console.WriteLine("ExecuteReader Sonucu:");

            Console.WriteLine("----------------------");

            Console.WriteLine("Okunan Veriler = " + _dr["kisi_ad"].ToString());

 

            _con.Close();

            _dr.Close();

           

            Console.WriteLine("Verilerin okunma süresi = " + stpwch.Elapsed.ToString());

            Console.WriteLine("");

 

            /*ExecuteScalar*/

            Stopwatch stpwch2 = new Stopwatch(); //stopwatch sınıfından stpwch2 isimli bir değişken oluşturduk.

 

            SqlConnection _con2 = new SqlConnection(@"Data Source=XP7\XPSEVENSQLSERVER;Initial Catalog=deneme;Integrated Security=True");

            SqlCommand _cmd2 = new SqlCommand("select * from kisiler", _con2);

            _con2.Open();

 

            Console.WriteLine("");

            Console.WriteLine("ExecuteScalar Sonucu:");

            Console.WriteLine("----------------------");

 

            stpwch2.Start(); // stpwch2 değişkeninin ilk çalışma noktası burası

            Console.WriteLine("Okunan Veriler = " + _cmd2.ExecuteScalar().ToString());

            stpwch2.Stop(); // stpwch2 değişkeninin bitiş noktası burası.

 

            _con2.Close();

 

            Console.WriteLine("Verilerin okunma süresi = " + stpwch2.Elapsed.ToString());

            Console.ReadLine();

 

        }

    }

}

 

 
Projeyi derleyip çalıştırdığımda ekran görüntüsünü aşağıdaki gibi aldım.

12_11_2010_f2.jpg

Ekran çıktısındanda gözüktüğü gibi ExecuteScalar metodu ExecuteReader metodundan yaklaşık 2.5 kat daha hızlı çalışmaktadır. Yalnız bu değerler benim kendi PC kaynaklarıma göre çıkan sonuçlar. Performans değeri daha düşük ya da daha yüksek bir PC üzerinde bu sonuçların değerleri değişebilir. Ama hangi PC olursa olsun çıkan kıyaslama sonucu değişmeyecektir.

Evet Arkadaşlar bu örnekde mssql veritabanından tek bir değeri okurken kullanılan metodların veri okuma hızlarını test etmeye çalıştık.
Faydalı olması umuduyla hepinize kolay gelsin. 
İyi çalışmalar.


kategoriler:  C# |

.NET ortamında yazmış olduğumuz programlarda kullandığımız değişken türleri ikiye ayrılmaktadır. Bunlar değer türleri (value types) ve referans türleri (reference types) dir.

Değer Türleri (Value Types) :
Doğrudan veriyi taşıyan ve taşıdığı veriye göre bellek üzerinde yer dolduran değişken türüdür. Değer türleri bellekte az yer kaplar ve kendilerine hızlı bir şekilde erişilir. Değer türleri belleğin stack dediğimiz kısmında saklanır.

Referans Türleri (Reference Types):
Referans türlerinde aynen değer türlerinde olduğu gibi veri ram üzerinde stack alanında saklanır. Ayrıca ram üzerindeki heap denilen bölgede de verinin (nesnenin) adresini tutar. Burada daha fazla bellek kullanılır ve erişim daha zordur.

Aşağıda değer ve referans türlerine ait temel veri tipleri görülmektedir.

12_11_2010_e1.jpg


Değer türleri ile Referans türleri arasındaki en önemli fark belleğin farklı alanlarında depolanıyor olmalarıdır. Değer türleri stack, referans türleri ise heap alanında tutulur.

Bu iki tür arasındaki diğer bir fark ise; Değer türündeki bir değişkenin değeri başka bir değişkene atanırsa veri değeri kopyalanmış olunur. Referans türünde ise veri değerleri kopyalanmaz sadece bellekte bulunan adresi kopyalanır.

Bu anlattığımız kopyalanma olayını bir örnek üzerinde inceleyelim. Ben formun tasarımını aşağıdaki gibi yaptım.

12_11_2010_e2.jpg

Amacımız değer ve referans türünden oluşturulmuş değişkenlerin değerlerinin bir başka değişkene atandığında meydana gelen değişikliğin neler olduğunu anlamaya çalışmak. Kod tarafına geçiyoruz.

Form1.cs

        private void buttonValue_Click(object sender, EventArgs e)

        {

            int x = 50;
            int y = x;
            y = Convert.ToInt32(textBox1.Text);
            label2.Text = x.ToString();

// y değişkeninin değerine x'i atadıkdan sonra. y değişkeninin alacağı değeri textboxdan girilen değere eşitledik. fakat labela y değerini yazdırmak istediğimiz zaman textboxdan girilen değer yerine 50 değerini yazdı. 

        }

        public class Kopyalama

        {

            int x;
            public int X

            {

                get { return x; }
                set { x = value; }

            }

        }  // ufak bir class tanımlaması yaptık

 

        private void buttonReference_Click(object sender, EventArgs e)

        {

            Kopyalama ref1 = new Kopyalama();           
            ref1.X = 50;
            Kopyalama ref2 = ref1; 
            ref2.X = Convert.ToInt32(textBox2.Text);
            label4.Text = ref1.X.ToString();

            // burada ref1 isminde Kopyalama sınıfından yeni bir nesne türettik ve değerini 50 olarak belirledik. Daha sonra Kopyalama sınıfından ref2 isimli yeni bir nesne türettik ve bunu ref1 nesnesine eşitledik. Sonrasında ref2 nesnesinin değerini textboxdan girilecek olan değere eşitledik. Bu sefer ilk verilen değer yerine textboxdan girilen değer gösterildi.

        }

12_11_2010_e3.jpg

Şimdi nerede ne oldu onu anlamaya çalışalım. Biz burada x isimli değişkeni y isimli değişkene kopyaladıktan sonra stack üzerinde y için ayrı bir alan ayrıldı. Böylece her iki değişken birbirini etkilemeyerek farklı bellek adreslerinde tutuldu.
ref1 değişkeni ref2 değişkenine kopyalandığı zaman başvurulan nesnenin kendisi değil adresi ref2'ye kopyalanmış oldu. Böylece stack üzerinde farklı adreslerde bulunan ref1 ve ref2 değişkenleri aynı yeri ve heap üzerinde bulunan aynı adresi (Kopyalama nesnesinin yeri) göstermiş oldu.

Evet arkadaşlar bu yazımda değer ve referans türlerinin ne anlama geldiğini ve ram üzerinde hangi alanlarda saklandıklarını anlatmaya çalıştım.
Hepinize kolay gelsin. İyi çalışmalar.

 

kategoriler:  C# |

Sistemizde yüklü olan Visual Studio 2008'i ve beraberinde gelen yüklemeleri tek tek elle kaldırmak can sıkıcı olabilir. Eğer PC'den Visual Studio 2008'i sorunsuz bir şekilde kaldırmak istiyorsanız. Microsoft'un bunun için çıkardığı ufak bir programcık var bunu kullanabilirsiniz.


12_11_2010_02.jpg

Kaldırmak için gerekli olan yazılım: http://go.microsoft.com/fwlink/?LinkId=105801

Uninstall hakkında gerekli bilgi: Microsoft Visual Studio 2008 RC/RTM uninstall tool

kategoriler:  Visual Studio |


27 Mart 2010 saat: 17:36

Video gelecekteki muhtemel teknolojiler hakkında fikir veriyor. Ne kadar doğrudur bilemiyorum ama Microsoft bu ürünlerin patentlerini almış ve çıkış tarihini 2019 olarak belirlemiş.


 



kategoriler:  Microsoft |

Durum Yönetimi (state management) amacıyla kullanılan Session nesnesi server taraflı olandır. Client taraflı olan durum yönetim nesnesi Cookie'lerdir. Öncelikle Session nedir? Ne işe yarar? kısaca bundan bahsedelim ve cookie ile arasındaki farklara değindikden sonra kullanımını bir uygulama üzerinde görelim.
Session:
Bir oturum nesnesidir. Ziyaretçiler bir web sunucusundan herhangi bir sayfayı talep ettiğinde, sunucu bilgisayarlar gelen ziyaretçilerin herbirine ayrı ayrı oturumlar başlatır. Peki bu farklı oturumları nasıl birbirinden ayırt etmektedir? Şöyle ki Asp.net sunucularında oturum sahiplerini tanıyabilmek için özel bir algoritma ile oluşturulan tanımlayıcı bir değer kullanılır. Bu tanımlayıcı değerlere SessionID denilmektedir. İşte ziyaretçiler bu SessionID değerlerine göre bir birbirinden ayırt edilmektedir.
Session nesneleri yardımıyla kullanıcılara ait oturum bilgileri sayfalar arasında taşınabilmektedir. Tabiki bu bilgi taşıma olayı sonsuza kadar değildir. Bu süre Session'a atanan oturum süresi boyunca devam etmektedir. Session'ın son bulması için sadece belirlenen bu oturum süresinin dolmasıda gerekmez. Kullanıcı eğer geçerli olan tarayıcıyı kapatırsa oturumu otomatik olarak son bulacaktır. Ya da sunucu bilgisayarda oluşabilecek sorunlardan dolayıda oturumlar son bulabilir. Sessionda kullanıcıya ait pek çok bilgi tutulabilir (Örn. Kullanıcının adı, soyadı, şifresi, ip adresi vs.) Genel olarak Session nesnesinin kullanımına verilebilecek en güzel örnek alışveriş siteleridir. Burada kullanıcının sepetine ait olan bilgiler session'da tutulup site içerisinde sayfalar arasında taşınabilmektedir.
Cookie:
Cookie'lerde ise bu şekilde bir oturum sonlanması söz konusu değildir. Çünkü Cookie'ler istek yapılan sunucu bilgisayar tarafından bizim HDD mize bırakılan küçük .txt dosyalarıdır. Bu .txt dosyalarının içerisinde aynen sessionda olduğu gibi sunucunun bizi tanıması için gerekli olan bilgiler saklanmaktadır. Ve sadece bu kodu tanımlayan web sunucusu tarafından okunabilir. Fakat bu Cookie'deki bilgiler yönetici konumuna sahip kişilere ait kullanıcı adı ve parola bilgileride olabilir. Session'da bu bilgiler server bilgisayarda saklandığı için herhangi bir problem oluşturmuyordu. Fakat cookie'de ise bu bilgiler kullanıcıların bilgisayarlarında saklandığı için güvenlik noktasında sıkıntı oluşturmaktadır. Eğer kötü niyetli bir kişi yönetici konumundaki birinin cookie'sini çalıp kendi cookie'si ile değiştirirse çok da hoş bir sonuç çıkmaz ortaya. Bundan dolayı oturum yönetimlerinden session nesnesinin kullanımı daha sağlıklı ve güvenlidir.

Şimdi bu session olayını bir resim üzerinde görelim.

12_11_2010_d1.jpg

Evet resimde ifade etmeye çalıştığım gibi. Client (istemci bilgisayar) Server'dan (sunucu bilgisayar) bir talepde bulunur ve sunucu bilgisayardan kendisine bu talep doğrultusunda bir oturum açılır ve bir SessionID atanır. Oturum süresi boyunca da bu SessionID değerine göre tanınır.

Şimdi bu anllatığımız session olayını bir örnek üzerinde uygulayalım.

Default.aspx
Sayfamızın tasarımı aşağıdaki gibi olacak.
12_11_2010_d2.jpg

Amacımız textboxlara girilen kullanıcı adı ve şifre değerlerini session nesnesi aracılığı ile tutmak.
Burada ne gerçekleşicek?
Session Yaz
Biz textboxlara gerekli değerleri girdiğimiz zaman bu değerleri session'a yazdıracağız.
Session Oku
Az önce yazmış olduğumuz değerleri okutup listbox üzerinde göstereceğiz. Bu okuma işlemi sırasında otomatik olarak atanan sessionID değerinide listbox'da göstereceğiz.
Session Aktar
Burada ise kullanıcının session bilgilerini aynı oturum içerisinde iken bir başka sayfaya taşıyacağız. Bunun içinde projemize bir tane daha Web Form ekliyoruz ve üzerine üç tane label atıyoruz. Bu labellarda atanmış olan SessionID, Kullanıcı Adı ve Şifre bilgilerini göstereceğiz.

Evet şimdi gerekli işlemleri yapmamızı sağlayacak olan kodlarımızı her bir butonun click eventine yazıyoruz. Ve sayfamızın kod kısmının görüntüsü aşağıdaki gibi olacaktır.

Default.aspx.cs

protected void ButtonSessionYaz_Click(object sender, EventArgs e)

    {

        // TextBox lardan gelen değerleri Session'a atıyoruz.

        Session["KullaniciAdi"] = TextBox1.Text;
        Session["Sifre"] = TextBox2.Text;

        // Burada oturumun geçerlilik süresini belirliyoruz. Ben 1 dk olarak belirledim.

        Session.Timeout = 1;

         // Listbox'ı temizleyip. Session'ın yazıldığını belirtiyoruz.

        ListBox1.Items.Clear();
        ListBox1.Items.Add("Session yazıldı.");

   }

     protected void ButtonSessionOku_Click(object sender, EventArgs e)

     {

         // listbox'ı temizliyoruz.

         ListBox1.Items.Clear();

         // Burada ziyaretçiye SessionID atamış oluyoruz ve SessionID değerini listbox üzerinde gösteriyoruz. Bunu Session nesnesinin SessionID özelliği ile yaptık. Bu SessionID atama işlemini sayfanın Page_Laod'ında da yapabilirdik ve ilgili bir nesne üzerinde gösterebilirdik.

         ListBox1.Items.Add("SessionID değeri: " + Session.SessionID.ToString());

        // Burada Sessionlar'a değer ataması yapılmadan okuma yapılmaya çalışıldığında uyarı verdiriyoruz. Eğer Session Yazma işlemi yapıldıktan sonra session okuması yapılıyorsa atanmış olan değerleri listboxda gösteriyoruz.

        if (Session["KullaniciAdi"] == null)
              ListBox1.Items.Add("Session'lar boş. Değer giriniz.");

        else

        {  
            ListBox1.Items.Add("Kullanıcı Adınız: " + Session["KullaniciAdi"].ToString());
            ListBox1.Items.Add("Şifreniz: " + Session["Sifre"].ToString());

        } 

     }

     protected void ButtonSessionAktar_Click(object sender, EventArgs e)

     {

         // Burada ise kulanıcının oturum bilgileri olan SessionID, Kullanıcı Adı ve Şifre bilgilerini başka bir sayfaya taşıyoruz.

        Session["KullaniciAdi"] = TextBox1.Text;
        Session["Sifre"] = TextBox2.Text;
        Response.Redirect("Default2.aspx");

     }


Default2.aspx.cs

protected void Page_Load(object sender, EventArgs e)

    {

        // Burada SessionID, Kullanıcı Adı ve Sifre degerlerinin Default.aspx sayfasında da barındırıldığını görebiliyoruz. Mevcut olan oturum bilgilerini labellara yazdırdık.

        Label1.Text = "SessionID değeri: "+Session.SessionID.ToString();       
        Label2.Text = "Kullanıcı Adınız: "+Session["KullaniciAdi"].ToString();
        Label3.Text = "Şifreniz: "+Session["Sifre"].ToString();

    }

Şimdi projemizi çalıştırıp örneğimizi test edebiliriz. Projemizi çalıştırıp gerekli bilgileri textbox'a girdikten sonra Session Yaz butonuna tıkladığımızda listboxda Session yazıldı mesajının eklendiğini görebiliriz.

12_11_2010_d3.jpg

Şimdi de Session Oku butonuna basarak yazılmış olan Session değerlerinin ve SessionID numarasının listbox'a aktarıldığını görebiliriz. Aşağıda olduğu gibi.

12_11_2010_d4.jpg

Evet SessionID, girilen Kullanıcı Adı ve Şifre bilgilerinin session'dan okunarak listbox'a aktarıldığını görmüş olduk.
Şimdi de bu bilgilerin sayfalar arasında taşınmasına bakalım. Bunun içinde Session Aktar butonuna tıklıyoruz ve ekran görüntümüz aşağıdaki gibi olacaktır.

12_11_2010_d5.jpg

Evet aynı oturum içerisinde iken Session bilgilerinin bir başka sayfa olan Default2.aspx sayfasına aktarıldığını görmüş olduk.
Asp.net ortamında Session işlemleri temel olarak bu şekilde yapılıyor. Birde Session nesnesine ait bazı mode'lar bulunmakta. Bu mode'lar ile Sessionun tam olarak nerede saklanacağını belirtiyoruz. Fazla detayına girmeden kısaca bahsetmek istiyorum.
Öncelikle bu Session'a ait mode ayarlarını web.config dosyamız altında gerçekleştiriyoruz. Ve <sessionState mode=" "></sessionState> elemanını kullanarak yapıyoruz. mode=" " yazan kısma kullanmak istediğimiz mode ifadesini giriyoruz. Bu eleman <system.web></system.web> boğumunun içine yazılarak kullanılır. Aşağıdaki şemada session nesnesine ait mode'lar gösteriliyor.

12_11_2010_d6.jpg

Kısaca bunları açıklayalım.

InProc:
Varsıylan mode InProc dur. Bu mode'da session, Asp.net uygulamalarını çalıştran worker Process'de tutulur. Yani oturum değişkenleri site ile aynı bellek alanlarında bulunur. En hızlı saklama yöntemi bu olmasına karşın bir şekilde Worker Process ya da IIS uygulama havuzu sonlanırsa oturum değişkenleri de kaybolur. Örneğin uygulama havuzu için ayırdığınız bellek miktarı dolar ve uygulama havuzu tekrar başlarsa o anda sayfada bulunan tüm kullanıcıların oturum değişkenleri kaybolur.
StateServer
:
Bu mode'da oturum değişkenleri, iis ve wp den farklı bir uygulamada depolanır. Yani InProc dan farklı olarak, iis veya wp sonlansa dahi oturum değişkenleri kaybolmaz. Ancak sessiona attığınız objelerin serialise edilebilmesi kuralı InProc mode'una göre daha katıdır.
SQLServer:
Bu mode'da oturum değişkenleri bir Sql sunucusunda bulunur. Bu mode InProc kipine göre yavaş ama güvenirliği açısından etkili bir yöntemdir.
Custom: Yukarıda belirtilen kipler dışında oturum değişkenleri özel bir sağlayıcıda barındırılacaksa bu yöntem kullanılmalıdır.

Evet arkadaşlar bu yazımda Asp.net ile Session işlemlerinin nasıl yapıldığına ve Session nesnesine ait olan mode'lara değindik. Faydalı olacağını umuyorum..
Hepinize Kolay Gelsin. İyi Çalışmalar.

SessionUygulama.rar

kategoriler:  AspNet |

Bu yazımda Visual Studio 2008 ile Report Wizard nesnesini kullanarak web ortamında raporlama yapımını anlatacağım. Anlatım genel olarak resimler üzerinden olacak. Bu örneğimiz için MS Sql veri tabanını daha önceden hazırlamış olmanız gerekiyor. Çünkü raporlamanın mantığı veri tabanında sakladığımız bilgileri raporlar haline getirerek okunaklı ve düzenli bir şekilde sunmaktır. Visual Studio ortamında MS Sql veritabanı oluşturulmasına buradan bakabilirsiniz.

Neler gerekli;

Visual Studio 2008

Önceden hazırlanmış .mdf dosyası
Report Wizard Nesnesi

İlk Önce;

Yeni bir web Projesi oluşturuyoruz.

Sonrasında daha önceden hazırlamış olduğumuz veri tabanını App_Data klasörümüze ekliyoruz.

Başlıyoruz:
Asp.net ortamında raporlama işlemini gerçekleştirebilmemiz için Report Wizard nesnesini projemize dahil etmemiz gerekiyor. Projemizde sağ tuş tıklayıp Add New Item dan Report Wizard nesnesini ekliyoruz.

12_11_2010_c1.jpg


İlk defa ekleme yaptığımızda aşağıdaki pencere gelecektir. Next diyoruz. Bu pencerenin tekrar gelmesini istemiyorsanız Don't show this page again kısmını seçili yapın.

12_11_2010_c2.jpg


Next dedikten sonra wizard bize raporlamasını yapacağımız veritabanını seçmemizi söylüyor. Biz Database.mdf dosyamızı projemize daha önceden eklemiştik bundan dolayı veri tabanımız seçili olarak geldi ve next dedik.

12_11_2010_c3.jpg


Bundan sonra karşımıza gelen pencere bu uygulama dosyası için gerekli bağlantı stringini kaydetmek isteyip istemediğimizi soruyor. Bu şekilde next diyoruz.

12_11_2010_c4.jpg


Gelen pencerede görüntülemek istediğimiz veritabanı nesnelerini seçiyoruz.

12_11_2010_c5.jpg


Gelen pencerede personel tablomuza ait kolonları görüyoruz. Bundan sonraki aşamalar raporlama tasarım ayarlarımız ile ilgili düzenlemeleri içeriyor.

12_11_2010_c6.jpg


Bu pencere ise raporlama tasarımının tablo şeklindemi yoksa matris yapısındamı olacağını soruyor. Biz tablo görünümünü seçip next diyoruz.

12_11_2010_c7.jpg


Burada tüm detayları görüntülemek istediğimiz için bu şekilde aktarıyoruz.

12_11_2010_c8.jpg

Gelen pencereden blok halinde değilde basamaklı gösterimi seçiyoruz. Yanlardaki önizleme görünümü, seçimlerimizin nasıl bir düzende olacağı hakkında fikir sahibi olmamızı sağlıyor.

12_11_2010_c9.jpg


Buradaki pencerede farklı seçeneklerde stiller var. Ben Slate yi seçtim ve next dedik.

12_11_2010_c10.jpg


Next dedikten sonra rapor için seçtiğimiz bilgiler doğrultusunda bir özet sayfası geliyor. Finish diyoruz.

12_11_2010_c11.jpg


Finish dedikten sonra Report.rdlc sayfamız aşağıdaki gibi olacaktır.

12_11_2010_c12.jpg


Oluşturduğumuz raporu web sayfasında görüntüeyebilmek için Toolbox penceresinden Reporting altında bulunan MicrosoftReportViewer nesnesini Default.aspx sayfamıza sürükleyip bırakıyoruz.

12_11_2010_c13.jpg


Default.aspx sayfası aşağıdaki gibi gözükecek. Burada ReportViiewer Tasks altında Choose Report seçeneğinden Report.rdlc nesnesini seçiyoruz. seçme işleminden sonra ObjectDataSource'un geldiğini görüyoruz.

12_11_2010_c14.jpg


Projemizi çalıştırdığımızda ekran görüntüsü aşağıdaki gibi olmaktadır. Burada printer ikonuna tıkladığımızda bilgilerin çıktısını yazıcıdan alabiliriz. Bunun haricinde Export butonu bölümünden bilgilerimizi exel veya pdf formatında kayıt edebiliriz.

12_11_2010_c15.jpg


Görüldüğü gibi basit bir şekilde daha önceden oluşturduğumuz veri tabanındaki bilgileri rapor halinde düzgün bir şekilde gösterebildik. Tabiki raporlama bu kadar basit işlemlerle sınırlı değil. Konunun bütünlüğünü bozmamak adına detaylara girmedim sadece raporlamanın nasıl yapıldığını anlatmaya çalıştım. Belki bu konunun devamı niteliğinde ikinci bir dökümanda detaylarını ele alabilirim.

Hepinize kolay gelsin görüşmek üzere.

kategoriler:  AspNet |


24 Kasım 2009 saat: 12:13

Microsoft ile Google arasındaki rekabet; Arama motoru, tarayıcı, işletim sistemi derken. En sonunda programlama dilleri kısmında da kendisini gösterdi. Google yeni bir programlama dili çıkardı ve adı Go olarak duyuruldu. Google’ın yazılım mühendislerinden Rob Pike, uygulama geliştirmenin giderek zorlaştığını gördüklerini ve bunu basitleştirmek adına böyle bir projeye imza attıklarını belirtti. 2 yıl önce geliştirme çalışmaları başlayan Go’nun üzerinde çalışmak için ise geçtiğimiz yıl bir ekip oluşturuldu. Web sunucuları, depolama sistemleri ve veritabanı alanlarında uygulama geliştirmeyi sağlayacak olan Go'nun, yapılan katkılarla diğer alanlarda da kullanılabilir hale getirileceği belirtiliyor. Açık kaynak kodlu olan Go Programlama Dili, geliştiricilerinde katkılarına sunuluyor. Microsoft ile Google'ın rekabetleri bitecek gibi değil. Bakalım süreçler nasıl gelişecek.

Go programlama dili hakkında ayrıntılı bilgi almak için http://golang.org sitesini inceleyebilirsiniz.

İsterseniz Go Programlama Dili seminerinede göz atabilirsiniz.

kategoriler:  Genel |