2 Eylül 2010 Perşembe

.NET Form Uygulamalarında Web Servis Kullanımı

Günümüzde gerek desktop uygulamalarında olsun, gerek online uygulamalar da olsun, web servis kullanımı gittikçe yaygınlaşmaktadır ve yaygınlaşmaya da devam edecektir.

En basit haliyle web servisin tanımını yapmak istersek: Web servisler farklı platformların aynı dilde konuşmasına yani haberleşmesine imkan sağlayan kullanıcı tanımlı fonksiyonlardır. Evet aslında web servisler bizim uygulamlarımızda her hangi bir işi yaptırmak için yazdığımız fonksiyon(procedure) lardan farksızdır.

.Net te webservis oluşturmak ve oluşturduğumuz bu web servisi projemize import edip kullanmak oldukça kolaydır. Ancak biz bu yazımızda buradaki adreste sunulmakta olan tc kimlik no doğrulamaya yarayan bir web servisi kullanacağız. Bu web servisi kullanmak veya kendi oluşturduğumuz bir web servisi kullanmak arasında yapılan işlemler açısından pek fark yoktur. ( Eğer kendi oluşturduğumuz bir web servisi kullanmak istersek, bu web servisi IIS ile local de yayınlamamız gerekecektir. )

Öncelike yeni bir windows form application projesi oluşturuyoruz ve tasarımını aşağıdaki gibi yapıyoruz. Bu arada .net projemizde dil olarak c# kullanacağız.( Proje dediysek bir kaç satır koddan ibaret olduğunuda belirtmekde farda var :P )




Tasarımımızı bu şekilde yaptıktan sonra, yukarıda belirttiğimiz url deki web servisi projemize import etmeiyiz. Eğer Url e tıkarsanız, web servisin TCKimlikNoDogrula adında sadece bir adet fonksiyon ihtiva ettiğini görebilirsiniz. Web servisi projeye import etmek için şekilde görüldüğü gibi, referanslar klasörüne sağ tıklayıp, "Add Service Reference" diyoruz.




Açılan pencerede adres çubuğuna http://tckimlik.nvi.gov.tr/Service/kpsPublic.asmx yazıp Go ya tıklıyoruz ve sonuçta şekildeki gibi bir ekranla karşılaşmamız gerekiyor.





Bu ekranda iken Okay butonuna tıklarsak, web servisimizi projemize referans yapmış oluruz. Bu aşamadan sonra web servisimizin tüm fonksiyonlarını kullanabileceğiz. Sorgula isimli butonumuzun click event ine aşağıdaki kodu yazarak projemizi sonlandırmış olacağız.






tüm bu adımlardan sonra, artık web servisimizi kolaylıkla kullanabileceğiz. Web servisten kullandığımız TCKimlikNoDogrula( ) isimli fonksiyon 4 parametre almaktadır. Bunlar tc no, ad, soyad ve doğum yılıdır. Bu parametreleri alan TCKimlikNoDogrula() fonksiyonumuz geriye bool tipinde bir değer döndürmektedir. (tc no mevcutsa ve bilgileri girilen kşiye aitse true, değilse false değeri döner.)

Örnek olarak kendi bilgilerimi girdiğim ve sonuç aldığım ekran görüntüsü :




1989 olan doğum tarihimi değiştirip, 1988 yaptığımda ise aldığım ekran görüntüsü:





Bu basit proje ile amacımız, internet ortamıdna yayınlanmakta olan hazır bir web servisin .net ile olan entegrasyonunu göstermek idi. Umarım birileri için faydalı olabilir :))

29 Mart 2010 Pazartesi

STEGANOGRAPHY - ( Steganografi )

  Bitirme projemi Steganografi alanında aldım. Bir yıl öncesinden başlamıştım düşünmeye aslında, uğraşırken haz duyacağım ve bana katkı sağlayabilecek bir proje almayı çok istiyordum. Aklımda yapay sinir ağları ile alakalı bir kaç proje belirlemiştim. Onlardan biri plaka tanıma sistemi idi. Çok ilgimi çeken bir konuydu ve bitirme projemi onun üzerine almak istiyordum. Sayın hocam Yrd. Do. Dr. A. Bedri ÖZER ile bitirme hakkında konuşmak için gittiğimde bana steganografi den bahsetti. Daha önce hiç duymamıştım ancak anlattığı kadarıyla ilgimi çekmişti. Bende 1 gün süre istedim ve araştırmalar yaptım. İşte budur abi, dedim biraz araştırma yaptıktan sonra . Projeye başlamak için sabırsızlanıyordum gerçekten. Sabah erkenden gidip projeyi almak istiyordum, hocamın benden önce konuyu başka birisine verecebileceğinden bile korktum :D
O derece ilgimi çekmişti çünkü....

  Projeye başlamdan önce resim formatları hakkında araştırmalar yaptım. Daha sonra oluşurduğum deneme projesi üzerinde çalışmalara başladım...

  Steganografiden bahsetmeden projeye geçilmez heralde :)
Steganografi yi kısaca veri saklama sanatı olarak özetleyebiliriz. Steganografi için genelde resim, video ve müzik dosyaları taşıyıcı olarak kullanılıyor. Taşıyı dosya, gizli veriyi içeren dosya ya verilen isimdir. Bu dosyaya ayrıca stego dosyada denilmektedir.

  Stego dosya ya veri saklamak için birden fazla yöntem vardır. Bunlardan en yaygın kullanılanı ise LSB( Lowest Significant Bit ) yöntemidir. Projemde stago dosya olarak resim dosyalrını seçtim. Ve yöntem olarakta LSB yöntemini kullandım.

  LSB yöntemine göre , her byte ın son biti kullanılmak için tahsis edilir. Dosyaya saklanacak karakterler in binary hali elde edildikten sonra, her byte ın son biti ne sırasıyla karakterkerin binary karşılıları saklanır. Burada , bu yöntemi güzel yapan nokta şudur: Örneğin, eğer sıradaki saklancak bitimiz '0' ise ve değiştireceğimiz bitimizde aynı şekilde '0' ise , hem verimizi saklamış olacağız, hemde orjinal bitimiz değişmemiş olacaktır. Kaldı ki, bitimizin değişmesi durumuda bizim için çok önemli olmayacaktır. Çünkü son bitteki bir bitlik değişim için gözle görünecek bir renk farklılığı oluşmayacaktır. Yani kullandığımız tüm son bitler değişse bile ve hatta resimdeki tüm byte lerı kullansak dahi resim stego resmimiz ile orjinal resmimiz arasında insan gözünün algılayacağı bir frekans farklılığı meydana gelmiycektir. böylece stego resim verimizi başarıyla kamüfle edecektir...

  Bu kadar edebiyattan sonra yavaş yavaş projeye geçebilirz galiba.. Burada projenin tüm kodalrını verecek kadar paylaşımcı bir insan değilim :P

  Bu arada projemi .Net te c# kullararak yaptım ve .Net te bu iş için hazır kütüphanelr olduğunu öğrendim. Ancak bu kütüphanelere elimiz bile sürmedim :P
Yani el emeği göz nuru oldu diyebiliriz.. :) Burada sadece karşılaştığım sorunlardan bahsedeceğim ve projenin ekran görüntülerini vereceğim. Ayrıca bir orjinal resim ile stego resmide beraber vererek, az önce bahsettiğimiz bozulmaların ne denli farkedilemeyecek olduğunuda göreceğiz. Öncelikle sade görünümlü ara yüzümüzü görelim:



  Görüldüğü gibi iki adet tab page imiz var. Bunlardan biri verimizi saklamak diğeri ise tekrar elde etmek için kullanılıyor. Sağ üst köşede Dosya Aç butonu ile açtığımız resme ait bilgiler görüntülenmektedir. Karakter kapasitesi ile belirtilen kısıma seçilen resim için saklanabilecek maksimum karakter sayısı yazılmaktadır.


  Örnek bir saklma işleminden sonra ise arayüzümüz aşağıdaki bigi olmaktadır:





  Şuan form üzerinde görüntülenen resim aslında orjinal resim değildir. Yani stego resmimizdir, bu resmi Kaydet butonu ile bir dizine kaydetmeliyiz. Kayıt işleminden sonra Çıkar sekmesine gelerek kaydettiğimiz bu stego resmimizi seçtikten sonra Çıkar butonuna basmamız halinde ise görüldüğü üzere veriler okunarak metin kutusuna yazılmış olacaktır:




  Görüldüğü gibi saklanan karakter sayısı ve okunan karakter sayısı eşittir. Buda herhangi bir veri kaybımızın olmadığını gösterir. Bunu anlamak için çıkarılan metnimizide kontrol edebiliriz tabiki.. Bir başka değinilmesi geeken nokta ise, işelem süreleridir. Görüldüğü gibi saklama işlemimiz okuma işleminden daha fazla zaman almıştır. Aradaki zaman farkı saklanan karakter sayısı ile doğru orantılıdır.

  Veri saklama işleminde karşılaştığım bir sorunu paylaşmak isterim; Saklam işleminde karakterlerin binary karşlığı için ASCII standardını kullandım. Bu standartta Türkçe karakterlerin karşılığı yoktur. Aslında var.. Bir Türkçe karakteri ASCII olarak bir text box a yazdırdığım zaman 8 bitlik bir değer gördüm. Halbuki ASCII 7 bitlik bir standart tır? (!) Tüm karakterlerin binary karşılık uzunluğu eşit olmaldıır. Aksi halde saklama ve okuma işlemlerini yapmak mümkün olmaycaktır. Bu sorunu çözmek için bir kaç fonksiyon yazdım. Bilindiği gibi neredeyse hiç kullanılmayan ASCII karakterler vardır. Örneğin 'null' karakteri gibi. Bu karakterin ASCII karşılığı 10 (1010) dur. Bu ve bunun gibi 13 karakteri Türkçe karakterleri kodlamak için kullandım. Böylece Türkçe karakter sorununu adil olmayan yollardan çözmüş oldum ^_^.

  Bir başka önemli sorun ise space( boşluk) karakteri gibi karakterlerin 6 bit ile ifade edilebilmeleridir. Dediğimiz gibi tüm karakterler eşit uzunlukta binary e cevrilmelidirler. (7 - bit). Bu sorunu çözmek ise daha kolay oldu. 6 bitlik karakterlerin başına bir adet '0' biti yerleştirerek bu sorunuda halletmiş oldum. Bu ve bunu gibi ufak tefek sorunlarla boğuşara projemi bitirdim. Orjinal ve stego resim arasındaki 7 farkı bulana kodlarımı verecem :P :D




  Sol: Orjinal Resim        Sağ: 1458 adet karakter içeren taşıyıcı

21 Kasım 2009 Cumartesi

IIS ve Visual Studio Olmadan Asp.Net Projesi Çalıştırma

Bu yazının içeriği başlığından da anlaşılabileceği gibi Asp.Net projelerimizi IIS veya Visual Studio olmadan nasıl çalıştırabileceğimizdir.

Bu iş için google ın bir web hizmeti olan YouWebIt1 adlı bir programı kullanacağız. Aslında bu tam olarak bir program sayılmaz. Sadece çok küçük boyutlu bir .exe dosyası.

Üstelik bu program projemizi V.S. dan daha hızlı bir şekilde açabiliyor. (internet bağlantısı mevcut olan bilgisayarlar için geçerli)

Programın kullanımına geçmeden önce buradan indirmeliyiz. Programı indirdekten sonra .exe file ımızı çalıştımak istediğimiz projemizle aynı dizine kopyalıyoruz. Yani sayfalarımızın bulunduğu dizine..




Kopyalama işleminden sonra .exe file ımızı çalıştırıyoruz. Program bulunduğu dizindeki deault.aspx sayfasını buluyor ve direkt olarak localhost ta çalıştırıyor. Program çalıtıktan sonra sağ alt köşede programın simgesini görüyoruz. Bu simgeye sağ tıklayarak programı kapatabilir veya projemizi çalıştırma istediğimiz browser ı seçebiliriz.




Tüm yapılması gerekenler bunlar. İyi çalışmalar...

20 Kasım 2009 Cuma

ASP.NET te flash animasyon kullanma

Merhabalar;

Bu yazımızda Asp.Net projelerimizde flash da yaptığımız animasyonlarımıza nasıl yer verebileceğimizden bahsedeceğiz. Bu iş için tabiki bir .dll dosyasına ihtiyacımız olacaktır. Bu .dll dosyasını kendimiz yazacağımız gibi buradan indirerek te toolbox mıza ekleyip kullanabiliriz.

VS veya Visual Web Developer ortamında toolbox a yeni bir component eklemeyi bilmeyenler için kısaca bakarsak;

Öncelikle toolboxımızda yeni bir tab oluşturup adına "flashekle" gibi bir isim vererek yada var olan herhangi bir tab içerisinde sağ tıklayarak choose items diyoruz.


Daha sonra aşağıda görülen formda .net framework components tabı seçiliyken browse dieyerek .dll dosyamızı ekliyoruz ve tamam diyoruz.


Bu işlemden sonra component i toolbox ımızda görmemiz gerekir aksi halde bir hata yapmışız demektir.


Tüm bu işlemlerden sonra componentimizi sürükle bırak yaparak sayfamızda istediğimiz bir yerde kullanabiliriz. Url kısmında oynatmak istediğimiz animasyonun path ini vermeliyiz. Ayrıca loop ismindeki check box ı da tick lersek animasyonumuz döngüye girecek yani animasyon sonuda tekrar baştan başlayacaktır...

İyi çalışmalar...

27 Eylül 2008 Cumartesi

C#.NET İLE G-MAİL HESABINDAN DİĞER HESAPLARA MAIL


name="ProgId" content="Word.Document">

.NET in resmi dili olarak gösterilen c# ile framework kütüphanesinin olanaklarından faydalanmak oldukça kolaydır. .NET framework kütüphanelerinde yer alan system.net ve system.net.mail isim alanları sayesinde herhangi bir web sitesini ziyaret etmeden bir masaüstü uygulaması gibi istenilen adresten başka bir adrese mail gönderme programı yapmak mümkün hale gelmiştir. Bu program yalnızca gmail hesabından mail gönderme özelliğine sahiptir. Birkaç yeni özellik eklenerek tüm hesaplardan gönderim sağlanabilir. Alıcı ise tüm mail hesaplarından olabilir.

Program SMT(simple mail transfer) protokolü kullanılarak mail göndermektedir.SMTP server olarak “smpt.gmail.com” yazılması nedeniyle sadece gmailden gönderim yapmaktadır. Programın görünümü aşağıdaki gibidir.



Gönder butonu içine gömülen kodlar:

gonder();

if (hata !=1)

{

MessageBox.Show("İLETİNİZ BAŞARIYLA GÖNDERİLDİ", "İLETİM MESAJI", MessageBoxButtons.OK, MessageBoxIcon.Information);

}

Görüldüğü üzere gönder butonunda sadece gonder() adında bir fonksiyon vardır bu fonksiyon ise aşağıdaki gibidir.

void gonder()

{

string kullanıcı = textBox_kullanıcı.Text, şifre = textBox_şifre.Text;

MailMessage MailGonderelim = new MailMessage();

MailGonderelim.To.Add(textBox_kime.Text.ToString());

MailGonderelim.Subject = textBox_konu.Text.ToString();

MailGonderelim.From = new MailAddress(textBox_kimden.Text.ToString());

MailGonderelim.Body = textBox_konu.Text;

if (eklenecekDosya != null)

{

Attachment MaileDosyaEkleyelim = new Attachment(eklenecekDosya);

MailGonderelim.Attachments.Add(MaileDosyaEkleyelim);

}

SmtpClient smtp = new SmtpClient("smtp.gmail.com");

smtp.EnableSsl = true;

NetworkCredential cred = new NetworkCredential(kullanıcı,şifre);

smtp.Credentials = cred;

try

{

smtp.Send(MailGonderelim);

}

catch

{

MessageBox.Show("Hatalı Giriş!");

hata = 1;

}

}

Öncelikle formun üst kısmında görülen kullanıcı adı ve şifre ilgili textbox lardan alnıyor.Ardından

System.Net isim alanında yer alan MailMessage sınıfından MaiGonderelim adında bir nesne oluşturuluyor. Oluşturduğumuz bu nesne sayesinde artık MailMessage sınıfının tüm özellikerinden faydalanabiliyoruz. Kodlarda da görüldüğü gibi formun gerekli yerlerinden e-mailin nerden alınacağı başlığı ve nereye ne gönderileceği tek tek Mailgonderelim nesnemiz ile belirlenmektedir.

if (eklenecekDosya != null)

{

Attachment MaileDosyaEkleyelim = new Attachment(eklenecekDosya);

MailGonderelim.Attachments.Add(MaileDosyaEkleyelim);

}

Yukarıdaki kısım ise formumuza eklemiş olduğumuz OpenFileDialog elemanı ile e-mail imize bilgisayarımızdan dosya eklememizi sağlar. Kullanıcı Dosya Ekle butonuna tıklayınca ilk anda aşağıdaki komutlar yürütülür.

private void button2_Click(object sender, EventArgs e)

{

if (OpenFile.ShowDialog() == DialogResult.OK)

{

eklenecekDosya = OpenFile.FileName.ToString();

//Dosyamızın adresini string içerisine yazıyoruz

textBox_EK.Text = OpenFile.SafeFileName.ToString();

//kullanıcıya ekledigi dosyanın adını gosteriyoruz

}

Burada eklenecekdosya isimli önceden tanımlanmış olan string dosyanın ismini alıyor. Daha sonra kullanıcı gönder butonuna bastığı anda eklenecekdosya stringi NULL değerinde değilse yani bir dosya eklenmişse sayfa başındaki if şartı sağlanır ve System.Net.Mail isim alanının başka bir sınıfı olan Attachment sınıfı sayesinde dosya ekleme işlemi kolayca gerçekleştirilir ve son aşamaya geçilmiş olur.

SmtpClient smtp = new SmtpClient("smtp.gmail.com");

NetworkCredential güvenlik = new NetworkCredential(kullanıcı,şifre);

smtp.Credentials = güvenlik;

E-mail gönderme işlemini SMT(Simple Mail Transfer) protokolüyle yaptığımız için smtpClient sınıfından smtp adında bir nesne oluşturuyoruz ve parametre olarak smtp server adını veriyoruz.

NetworkCredential sınıfı ise güvenlik için kullanılmıştır. Smtp nesnemizin Credentials özelliğine gmail için geçerli bir kulanıcı adı ve şifre gönderilmezse smtp server isteğimizi reddedecektir ve e-mail gönderimi başarısız olacaktır.

Son olarak smtp nesnemizin send metoduyla MailMessage sınıfından türettiğimiz MailGonderelim nesnemizi yani e-mail imizi gönderiyoruz. Bu işlemi yaparken. net framework kütüphanesinin sağladığı istisnai durum yakalama(exception) kontrolünde try- catch bloğu kullanılmıştır. Try bloğunda yapılmak istenen işle ilgili komutlar verildikten sonra catch bloğunda ise kullanıcıya MessageBox sınıfı ile bir hata mesajı verilerek istenmeyen durumlardan kurtulma sağlanmış olur.

try

{

smtp.Send(MailGonderelim);

hata=0;

}

catch

{

MessageBox.Show("Hatalı Giriş!");

hata = 1;

}

Burada catch bloğuna düşme kullanıcının yanlış bir kullanıcı adı veya şifre vermesinden dolayı , smtp server dan kaynaklanan bir hata ,internet bağlantısından kaynaklanan bir hata veya sebebini anlayamadığımız başka bir hatadan kaynaklanabilir. İşte bu anlaşılmaz hatalar için .NET de exception(istisnai durum yakalama) kontrolü geliştirilmiştir. Hata=1 komutun ise iletim mesajının gönderileceği esnada bir hatanın oluşup oluşmadığını kontrol etmek için kullanılmıştır. Hata değişkeninin değerine göre hata veya iletim mesajı gönderilir.

Faydalı olması dileğiyle...