Webrequest | Engin Polat\'ın Windows 8 , Windows Phone 8 ve C# içerikli programcılık sitesi

Arşiv

Etiketlenen yazılar webrequest

Windows Phone 8 ile WebClient sınıfında async kullanımı

13 December 2012 Yorum yapılmamış

İnternet üzerinden veri indirmeden Windows Phone 8 ile uygulama geliştirmek genellikle pek beklenmez.

async ve await anahtar kelimeleri hayatımıza girdikten sonra internetten veri indirmek gibi uzun sürebilecek işleri asenkron yapmaya başladık.

Fakat WebRequest ve WebClient sınıflarında async/await pattern‘inin eksikleri hissediliyor.

Örneğin WebClient sınıfının DownloadStringAsync method’unu inceleyelim;

public void DownloadStringAsync(Uri address);

Gördüğümüz gibi, geriye Task veya Task<T> tipinde sonuç döndürmüyor.

Bu yüzden bu method’u await anahtar kelimesi ile kullanamıyoruz;

WebClient wc = new WebClient();
await wc.DownloadStringAsync(new Uri("http://www.enginpolat.com"));

Daha derleme esnasında

// Cannot await "void"

hatası alırız.

Fakat aşağıdaki sınıfı ve extension method’u kullanarak WebClient sınıfına Task<T> sonuç döndüren method ekleyebiliriz;

public static class Extensions
{
	public static Task<string> DownloadStringTask(this WebClient client, Uri uri)
	{
		var tcs = new TaskCompletionSource<string>();

		client.DownloadStringCompleted += (s, e) =>
		{
			if (e.Error != null)
			{
				tcs.SetException(e.Error);
			}
			else
			{
				tcs.SetResult(e.Result);
			}
		};

		client.DownloadStringAsync(uri);

		return tcs.Task;
	}
}

Örnek kullanım;

WebClient wc = new WebClient();
return await wc.DownloadStringTask(new Uri("http://www.enginpolat.com"));

Dosya boyutu almak için Head isteğinde bulunmak

05 October 2011 1 yorum

Uygulamalarımızda internet üzerindeki bir dosyanın boyut bilgisine ihtiyacımız olabilir.

Yapmamız gereken; dosyaya istekte bulunup Length özelliğinden dosya boyutu bilgisini almak.

var DosyaKonum = "http://www.enginpolat.com/wp-content/uploads/2011/07/FPSOrnek.rar";

WebClient wc = new WebClient();
var Dosya = wc.DownloadData(DosyaKonum);

int DosyaBoyut = Dosya.Length;

Bu yöntemin en önemli dezavantajı, dosyanın boyut bilgisini alabilmek için dosyayı gerçekten download etmemiz gerekiyor. Özellikle büyük boyutlu dosyalarda bu yöntem büyük problemlere yol açacaktır.

Aslında yapılan isteğin sonucunun Başlık (Header) bilgisinde dosya boyutu yer alıyor. Eğer Başlık‘tan (Header) boyut bilgisine ulaşabilirsek dosyayı download etmemize gerek kalmaz.

var DosyaKonum = "http://www.enginpolat.com/wp-content/uploads/2011/07/FPSOrnek.rar";

var Request = WebRequest.Create(DosyaKonum);

Request.Method = "HEAD";

var Response = Request.GetResponse();

var DosyaBoyut = Response.Headers[HttpResponseHeader.ContentLength];

Öncelikle WebRequest sınıfının static Create() method’u sayesinde, parametresinde adresi verilmiş dosyaya bir istek oluşturuyoruz.

Request değişkeninin GetResponse() method’undan sonuç bilgisini almadan önce Method özelliğine HEAD değerini atıyoruz.

Böylece istek sonucunda, dosyanın içeriğinin değil sadece başlık bilgisinin bulunmasını sağlıyoruz.

HttpResponseHeader enum’ında yeralan ContentLength değeri ile Response değişkeninin Headers özelliğinden dosyanın boyut bilgisine ulaşabiliyoruz.