13 Ağustos 2018 Pazartesi

WebClient Sınıfı

Giriş
Şu satırı dahil edieriz.
System.Net.WebClient
WebClient, HttpWebRequest'e göre kullanması daha kolay bir sınıf. Ancak .Net 4.5 ve sonrasında WebClient yerine HttpClient sınıfını kullanmak çok daha kolay olabilir.
WebClient kendisi altta HttpWebRequest ve HttpWebResponse sınıflarını kullansa da bize bu sınıfları göstermiyor. Dolayısıyla streamlerle uğraşmak gerekmiyor.

Kullanım
Şöyle yaparız.
Uri URI = new Uri($"ftp://{server}/{targetFilePath}");
using (WebClient client = new WebClient())
{
  client.Credentials = new NetworkCredential(username, password);
  client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(progress);
  client.DownloadFileCompleted += new AsyncCompletedEventHandler(complete);
  client.DownloadFileAsync(URI, localFilePath);
}
Constructor
Şöyle yaparız.
WebClient wc= new WebClient();
DownloadData metodu
Sonucu byte[] olarak döndürür. Şöyle yaparız.
byte[] downloadData = wc.DownloadData("https://example.com/example.txt");
Bunu stream olarak kullanmak istersek şöyle yaparız.
using (var stream = new MemoryStream (downloadData))
{
  ...
}
DownloadFile metodu
Şöyle yaparız.
wc.DownloadFile("url", "directory + filename");
DownloadFileAsync metodu
Belirtilen hedefi dosya olarak indirir. Şöyle yaparız.
wc.DownloadFileAsync(new Uri("http://..."),@"c:\folder\10MB.zip");
DownloadFileCompleted Event
Ekranda ilerlemeyi gösterme imkanı sunarlar.
WebClient wc= new WebClient();
wc.DownloadFileCompleted += C_DownloadFileCompleted;
wc.DownloadFileAsync(...);


void C_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
{
  MessageBox.Show("completed");
}
DownloadProgressChanged Event
Ekranda ilerlemeyi gösterme imkanı sunar
Örnek
Şöyle yaparız.
WebClient wc= new WebClient();
wc.DownloadProgressChanged += DownloadProgressChanged;
wc.DownloadFileAsync(...);

void DownloadProgressChanged(object sender,DownloadProgressChangedEventArgs e)
{
  progressBar1.Maximum = (int)e.TotalBytesToReceive / 100;
  progressBar1.Value = (int)e.BytesReceived / 100;
}
Örnek
Şöyle yaparız.
delegate (object sender, DownloadProgressChangedEventArgs e)
{
   $"{(e.BytesReceived/1024).ToString()}KB/{(e.TotalBytesToReceive/1024).ToString()} KB";

   (int)(e.BytesReceived / (float)e.TotalBytesToReceive * 100);
}
Örnek
DownloadProgressChangedEventArgs nesnesinin ProgressPercentage özelliği de kullanılabilir.
wc.DownloadProgressChanged += (o, e) =>
{
  .....e.ProgressPercentage.ToString();
};
DownloadString metodu
Tüm sayfayı tek bir string olarak indirir. Şöyle yaparız.
var json = wc.DownloadString("http://myurl");
DownloadStringCompleted Event
Şöyle kullanırız.
wc.DownloadStringCompleted +=...;
DownloadStringTaskAsync metodu
Şöyle yaparız
Task t = await wc.DownloadStringTaskAsync(url);
Headers Alanı
Accept eklemek için şöyle yaparız.
wc.Headers[HttpRequestHeader.Accept] = "application/json";
Accept eklemek için şöyle yaparız
wc.Headers["Accept"] = "text/xml";
Authorization eklemek için şöyle yaparız.
wc.Headers[HttpRequestHeader.Authorization] = "Basic " + 
Convert.ToBase64String(new ASCIIEncoding().GetBytes(usernamePassword));
ContentType eklemek için şöyle eklenir.
wc.Headers[HttpRequestHeader.ContentType] = "application/json";
ContentType eklemek için şöyle yaparız

wc.Headers["Content-Type"] = "text/xml";
Cookie eklemek için şöyle yaparız.

client.Headers.Add(HttpRequestHeader.Cookie, 
              "cookiename1=cookievalue1;" +
              "cookiename2=cookievalue2");
Referrer eklemek için şöyle yaparız.
wc.Headers.Add(HttpRequestHeader.Referer, "http://...");

User-Agent eklemek için şöyle yaparız.
client.Headers.Add("User-Agent", "...");
OpenRead metodu
Şöyle yaparız.
Stream stream = wc.OpenRead("http://...");
UploadFile metodu
Örnek
Şöyle yaparız.
client.UploadFile("ftp://ftp-server/directory/filename.ext", localfullpath);
Örnek
Şöyle yaparız.
client.UploadFile("http://...","POST", "filePath");
Örnek
Şöyle yaparız.
wc.UploadFile("https://uat.xxxxxx.com.au/soap/upload.aspx", "C:\temp\soap.xml");
Diğer
AutomaticDecompression
WebClient sıkıştırılarak gönderilen veriyi açamıyor. Şöyle yapmak gerekiyor.
class MyWebClient : WebClient
{
  protected override WebRequest GetWebRequest(Uri address)
  {
    HttpWebRequest request = base.GetWebRequest(address) as HttpWebRequest;
    request.AutomaticDecompression = DecompressionMethods.Deflate | 
                                     DecompressionMethods.GZip;
    return request;
  }
}
Cookie
WebClient sunucu tarafından gönderilen cookie'leri saklamıyor. Eğer cookie'leri saklayıp bir sonraki istek içinde kullanmak istersek iki tane protected metodu override etmek gerekiyor.


Hiç yorum yok:

Yorum Gönder