|
WebClient ile HTTP ve FTP Üzerinden Veri Transferi |
|
Gönderiliyor lütfen bekleyin... |
|
|
Bu makalemde WebClient
sınıfı ile HTTP ve FTP protokolü üzerinden veri transferi işlemlerinin nasıl
yapıldığından bahsedeceğim. 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
wClient = new WebClient();
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);
} |
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(); |
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();
} |
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)); |
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"); |
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(); |
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";
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();
wreq.GetRequestStream().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;
listBox1.Items.Add("Request
Time (ms)="+wreq.Timeout);
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.
HTTPWebRequest
programcıya, bu property’ler gibi HTTP protokolüne özel seçenekler sunmaktadır.
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;
FtpWebResponse
ftpRes = (FtpWebResponse)ftpReq.GetResponse();
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();
|
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.
Bugünkü makalemde,
sizlere WebClient ve WebRequest–WebResponse sınıflarını kullanarak temel internet
işlemlerinin yapımı hakkında bilgiler vermeye çalıştım. Bir sonraki makalemde
görüşmek üzere hepinize iyi çalışmalar dilerim.
Makale:
WebClient ile HTTP ve FTP Üzerinden Veri Transferi C#, Visual C# ve .NET Erhan Koçak
|
|
|
-
-
Eklenen Son 10
-
Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor
|
|