Belirli bir URI (uniform resource identifier)’ ye bir istekte bulunmak
için kullanılan en temel .NET sınıfı System.Net isim alanında bulunan WebClient
sınıfıdır
WebClient sınıfının temel metotlarını incelersek;
WebClient sınıfının temel metotlarını incelersek;
WebClient wClient = new WebClient();
wClient.DownloadFile("http://www.google.com", "C:\\google.html");
wClient.DownloadFile("http://www.google.com", "C:\\google.html");
Eğer sadece URI ‘yi diske kaydettmek istiyorsak, Yukarıdaki gibi
DownloadFile metodunu kullanabiliriz. Uygulamamızda web sayfamızdan gelen datayı
işlemek istiyorsak OpenRead metodundan faydalanabiliriz. Aşağıdaki örnek bir
web sayfasının kaynak kodunun okunması ile ilgilidir.
WebClient wClient = new WebClient();
Stream st = wClient.OpenRead("http://www.google.com");
StreamReader sr = new StreamReader(st);
string line;
while ( (line = sr.ReadLine()) != null)
{
listBox1.Items.Add(line);
}
Stream st = wClient.OpenRead("http://www.google.com");
StreamReader sr = new StreamReader(st);
string line;
while ( (line = sr.ReadLine()) != null)
{
listBox1.Items.Add(line);
}
WebClient sınıfının OpenWrite isimli metodu ise, bize URI ‘ ye data
gönderebilmemiz için yazılabilir stream döner.
WebClient wClient = new WebClient();
Stream st = wClient.OpenWrite("http://localhost/SimpleWebSite/Default.aspx","POST");
StreamWriter sw = new StreamWriter(st);
sw.Write("csharp");
sw.Close();
Stream st = wClient.OpenWrite("http://localhost/SimpleWebSite/Default.aspx","POST");
StreamWriter sw = new StreamWriter(st);
sw.Write("csharp");
sw.Close();
Bu kodu çalıştırdığımızda aşağıda Page_Load metodu görünen web sayfamıza
post işlemi gerçekleşmiş olur.
protected void
Page_Load(object sender, EventArgs e)
{
StreamReader sr = new StreamReader(Request.InputStream);
string gelen = sr.ReadToEnd();
Response.Write(gelen.ToUpper());
Response.End();
}
{
StreamReader sr = new StreamReader(Request.InputStream);
string gelen = sr.ReadToEnd();
Response.Write(gelen.ToUpper());
Response.End();
}
aspx sayfamıza hem post edip hem de dönen sonucu işlemek için WebClient
sınıfının UploadData metodundan faydalanabiliriz. UploadData metodu post
edilecek datayı byte dizisi olarak alıp, sonucu yine bize byte dizisi olarak
dönmektedir. Aşağıdaki örnek kullanım gösterilmiştir.
WebClient wClient = new WebClient();
byte[] postData = Encoding.ASCII.GetBytes("csharp");
byte[] response = wClient.UploadData("http://localhost/SimpleWebSite/Default.aspx", "POST", postData);
MessageBox.Show(Encoding.ASCII.GetString(response));
byte[] postData = Encoding.ASCII.GetBytes("csharp");
byte[] response = wClient.UploadData("http://localhost/SimpleWebSite/Default.aspx", "POST", postData);
MessageBox.Show(Encoding.ASCII.GetString(response));
Son olarak UploadFile metodu belirtilen yere, lokal dosyamızı upload
eder. Authentication için gerekli bilgileri Credentials property ‘sine set
edebiliriz.
WebClient wClient = new WebClient();
NetworkCredential myCred = new NetworkCredential("myUID", "myPWD");
wClient.Credentials = myCred;
wClient.UploadFile("http://localhost/SimpleWebSite/a.txt", "C:\\a.txt");
NetworkCredential myCred = new NetworkCredential("myUID", "myPWD");
wClient.Credentials = myCred;
wClient.UploadFile("http://localhost/SimpleWebSite/a.txt", "C:\\a.txt");
WebRequest ve WebResponse Sınıfları
WebClient sınıfı herhangi bir protokolü kullanarak, veri gönderip almak
(request-response) için tasarlanmış genel bir sınıftır. Belirli bir protokole
ait spesifik bir özelliği yönetemez (http için cookie’ler gibi). Bu tip
durumlar için yine System.Net isim alanında bulunan WebRequest ve WebResponse sınıflarını
kullanmamız gerekecektir.
İlk olarak, yukarda WebClient sınıfı ile de gerçekleştirdiğimiz birkaç
durumu WebRequest ve WebResponse sınıfları ile de gerçekleştirelim. Aşağıdaki
örnek bir URI ‘nin içeriğini yazdırmakla ilgilidir.
WebRequest wreq = WebRequest.Create("http://google.com");
WebResponse wres = wreq.GetResponse();
Stream st = wres.GetResponseStream();
StreamReader sr = new StreamReader(st);
string line;
while ((line = sr.ReadLine()) != null)
{
listBox1.Items.Add(line);
}
wreq.GetResponse().Close();
WebResponse wres = wreq.GetResponse();
Stream st = wres.GetResponseStream();
StreamReader sr = new StreamReader(st);
string line;
while ((line = sr.ReadLine()) != null)
{
listBox1.Items.Add(line);
}
wreq.GetResponse().Close();
WebRequest nesnesi farklı network protokollerini destekleyen abstract
bir sınıf olup, statik Create metodu ile kendisine verilen URI‘nin başlangıcına
göre (http, ftp, file) ilgili protokole göre initialize edillir.
HttpWebRequest,FileWebRequest ve FtpWebRequest sınıfları ise WebRequest’ den
türemiş, ilgili protokole göre özelleşmiş sınıflardır. Yukarda Create metodu,
kendisine verilen parametre doğrultusunda, aslında arka planda HttpWebRequest sınıfı
oluşturmuş, istek–cevap işlemlerini bu protokole uygun gerçekleştirmiştir. Oluşan
WebRequest nesnemizle, ilgili protokole spesifik işlemler yapmak istediğimiz
de, cast işlemiyle bunu gerçekleştirebiliriz.
WebResponse sınıfının yapısı da WebRequest sınıf yapısı ile aynıdır.
HttpWebResponse, FileWebResponse ve FtpWebResponse sınıfları WebResponse sınıfından
türemiş özelleşmiş sınıflardır. Yukarda oluşan WebResponse sınıfı da aslında
arka planda HttpWebResponse sınıfıdır.
Bu yapıya ‘pluggable protocols’
denmektedir.
Yukarıdaki kodumuzun ilk satırında Create statik metoduyla WebRequest
nesnemizi yaratıp, daha sonra WebRequest nesnemizin GetResponse metodu ile
WebResponse nesnemizi oluşturuyoruz. Oluşan WebResponse nesnemizin
GetResponseStream metodu ise bize, bulunduğumuz isteğin cevabını okuyabileceğimiz
stream nesnesi dönmektedir. Daha sonra bu stream sınıfından faydalanarak
gerekli okuma işlemini yapmaktayız.
Şimdi de, daha önce oluşturduğumuz web sayfasına veri post edip dönen
cevabı WebResponse sınıfı ile almayı görelim.
WebRequest wreq =
WebRequest.Create("http://localhost/SimpleWebSite/Default.aspx");
wreq.Proxy = WebProxy.GetDefaultProxy();
wreq.Method = "POST";
wreq.ContentType = "text/xml";
wreq.Proxy = WebProxy.GetDefaultProxy();
wreq.Method = "POST";
wreq.ContentType = "text/xml";
StreamWriter writer = new
StreamWriter(wreq.GetRequestStream());
writer.WriteLine("csharp");
writer.Close();
WebResponse wres = wreq.GetResponse();
StreamReader reader = new StreamReader(wres.GetResponseStream());
string cevap = reader.ReadToEnd();
writer.WriteLine("csharp");
writer.Close();
WebResponse wres = wreq.GetResponse();
StreamReader reader = new StreamReader(wres.GetResponseStream());
string cevap = reader.ReadToEnd();
wreq.GetRequestStream().Close();
wres.GetResponseStream().Close();
wres.GetResponseStream().Close();
MessageBox.Show(cevap);
Create metodu ile WebRequest nesnemizi yarattıktan ve gerekli
parametreleri bu nesnemize atadıktan sonra WebRequest nesnemizin
GetRequestStream metodu ile yazılabilir stream‘imizi elde ediyoruz. Post işlemini
bu stream’e yazarak gerçekleştirdikten sonra, dönen cevabı Yukarıdaki örnekte
olduğu gibi yine WebResponse nesnemizin GetResponseStream metodundan dönen
stream ile elde ediyoruz.
HTTP Başlık Bilgileri
HTTP protokolünün önemli bir özelliği, istek ve cevap bildirimlerinde başlık
bilgisi gönderebilmesidir. Bu bilgi cookie’lerle, yada tarayıcının istek
gönderim detayları ile ilgili olabilir. WebRequest ve WebResponse sınıfları da
başlık bilgisi okuma konusunda destek vermektedir ama HttpWebRequest ve
HttpWebResponse sınıfları HTTP protokolüne spesifik ekstra bilgiler de sağlar.
WebRequest wreq =
WebRequest.Create("http://localhost/SimpleWebSite/Default.aspx");
HttpWebRequest httpReq = (HttpWebRequest)wreq;
HttpWebRequest httpReq = (HttpWebRequest)wreq;
listBox1.Items.Add("Request Time (ms)="+wreq.Timeout);
listBox1.Items.Add("Request KeepAlive="+httpReq.KeepAlive);
listBox1.Items.Add("RequestAllowAutoRedirect="+httpReq.AllowAutoRedirect);
listBox1.Items.Add("Request KeepAlive="+httpReq.KeepAlive);
listBox1.Items.Add("RequestAllowAutoRedirect="+httpReq.AllowAutoRedirect);
Yukarıdaki kodu incelersek, http URI‘si ile yaratılmış WebRequest
nesnemizi HttpWebRequest nesnesine cast edip HTTP prokolüne spesifik
özellikleri yazdırıyoruz. Timeout property’si WebRequest tarafından da
desteklenen, istekte bulunduğumuz web sayfasından cevap gelmesi için beklenen
süreyi milisaniye cinsinden temsil eder. Bu süre sonunda cevap alınmazsa
WebException oluşur. Varsayılan 100.000 ms ‘dir.
KeepAlive property’si aynı bağlantı üzerinden birden fazla istekte bulunabilmemizi sağlar. Arka arkaya gelecek istekler için bağlantı açıp kapamada zaman kazandırır. Varsayılan değeri True’dur.
AllowAutoRedirect property’si ise yapılan isteğin, web sunucusu tarafından gerçekleştirilen yönlendirmeleri takip etmesini sağlar. Varsayılan değeri True’dur.
KeepAlive property’si aynı bağlantı üzerinden birden fazla istekte bulunabilmemizi sağlar. Arka arkaya gelecek istekler için bağlantı açıp kapamada zaman kazandırır. Varsayılan değeri True’dur.
AllowAutoRedirect property’si ise yapılan isteğin, web sunucusu tarafından gerçekleştirilen yönlendirmeleri takip etmesini sağlar. Varsayılan değeri True’dur.
HTTPWebRequest programcıya, bu property’ler gibi HTTP protokolüne özel
seçenekler sunmaktadır.
FtpWebRequest ve FtpWebResponse Sınıfları
FtpWebRequest ve FtpWebResponse Sınıfları
Framework 2.0 ile birlikte, daha önce Low-Level düzeyde, socket işlemleri
ile hallettiğimiz standart Ftp işlemlerini artık FtpWebRequest ve
FtpWebResponse sınıflarını kullanarak kolay bir şekilde halledebiliriz. Kullanım
şekli ise diğer network protokollerinde olduğu gibidir.
Aşağıdaki örnek, kullanıcı adı ve şifre gerektiren bir ftp adresindeki
bir dosyanın içeriğini elde etmeyi gerçekleştirir.
WebRequest wreq =
WebRequest.Create("ftp://10.222.2.88/erhan/down.txt");
FtpWebRequest ftpReq = (FtpWebRequest)wreq;
ftpReq.Credentials = new NetworkCredential("administrator", "433542");
ftpReq.Method = WebRequestMethods.Ftp.DownloadFile;
FtpWebRequest ftpReq = (FtpWebRequest)wreq;
ftpReq.Credentials = new NetworkCredential("administrator", "433542");
ftpReq.Method = WebRequestMethods.Ftp.DownloadFile;
FtpWebResponse ftpRes = (FtpWebResponse)ftpReq.GetResponse();
StreamReader sr = new StreamReader(ftpRes.GetResponseStream());
string content = sr.ReadToEnd();
ftpRes.GetResponseStream().Close();
StreamReader sr = new StreamReader(ftpRes.GetResponseStream());
string content = sr.ReadToEnd();
ftpRes.GetResponseStream().Close();
MessageBox.Show(content);
Yukarıdaki kodda, FtpWebRequest nesnemizi oluşturup kullanıcı ve şifre
bilgilerini Credentials property’ sine atadıktan sonra, Method property’sine
WebRequestMethods.Ftp.DownloadFile değerini atayarak dowload isteğinde bulunacağımızı
belirtiyoruz. Daha sonra FtpWebRequest nesnemizden GetResponse metodu ile
FtpWebResponse nesnemizi yaratıp GetResponseStream metodu ile ilgili stream’ e
ulaşmış oluyoruz.
Aşağıdaki örnektede aynı Ftp adresine dosya upload işlemini gerçekleştirmektedir.
WebRequest wreq =
WebRequest.Create("ftp://10.222.2.88/erhan/up.txt");
FtpWebRequest ftpReq = (FtpWebRequest)wreq;
ftpReq.Credentials = new NetworkCredential("administrator", "454t6432");
ftpReq.Method = WebRequestMethods.Ftp.UploadFile;
StreamWriter sw = new StreamWriter(ftpReq.GetRequestStream());
sw.Write("uploaded text");
sw.Close();
FtpWebRequest ftpReq = (FtpWebRequest)wreq;
ftpReq.Credentials = new NetworkCredential("administrator", "454t6432");
ftpReq.Method = WebRequestMethods.Ftp.UploadFile;
StreamWriter sw = new StreamWriter(ftpReq.GetRequestStream());
sw.Write("uploaded text");
sw.Close();
Yukarıdaki kodda, ilgili FtpWebRequest sınıfı yaratılıp, Method
property’sine bu sefer WebRequestMethods.Ftp.UploadFile değerini atayarak
upload işlemi yapacağımızı belirtiyoruz. Daha sonra FtpWebRequest nesnemizin
GetRequestStream metodu ile bize dönen yazılabilir stream’e dosya içeriğini
giriyoruz.
WebRequestMethods.Ftp sınıfı içerisinde dowload ve upload dışında ftp
adresinde gerçekleştirebileceğimiz diğer işlemler içinde değerler bulunmaktadır.
Yapacağımız işleme göre ilgili değeri Method property’sine atayıp , request ve
response sınıflarını kullanarak istediğimiz işlemi gerçekleştirebiliriz.
Hiç yorum yok:
Yorum Gönder