HTTP protokolü için dinleyicileri daha da basitleştirmek için, . .NET, System.Net isim alanında HttpListener sınıfını sağlar. Bu nesneye eşlik ederek, . .NET, HTTP işleme işini kapsayan bir dizi ilgili nesne sağlar. Bu sınıfın işi tamamlamak için Http.sys sistem bileşenleri kullandığını unutmayın, bu nedenle yalnızca Windows XPSP2 veya Server 2003 veya daha sonraki işletim sistemlerinde kullanılabilir.
HttpListener sınıfı, dinleme işlemini daha da basitleştirir ve dinleme çalışmasını başlatmak için yalnızca dinleme adresi, port numarası ve string yöntemi üzerinden sanal yolu sağlaması yeterlidir.
Dinlemeye başladıktan sonra, GetContext yöntemi iş parçacığını engeller, istemcinin isteği geldiğinde, HttpListener istemci isteklerini işlemek için genel proxy olarak bir HttpListenerContext nesnesini döndürür, proxy nesnesinin Request özelliği üzerinden istek parametrelerini temsil eden HttpListenerRequest tipinde bir nesne elde edebiliriz, bu nesne istek parametrelerinin çoğunu nesneleştirir, yani , talep parametrelerini sağladığı bir dizi özellik üzerinden alabiliriz. Örneğin, HttpListenerRequest'in HttpMethod özelliği istenen metod türünü sağlar. Proxy'nin Yanıt özelliği sayesinde, yanıtın verilerini ve işlemlerini kapsayan HttpListenerResponse tipinde bir yanıt işleme nesnesi elde edebiliriz; bu da yanıtın programlama iş yükünü büyük ölçüde basitleştirir ve çalışma süreci şu şekildedir:
//检查系统是否支持 if (! httpListener.IsSupported)
{ throw new System.InvalidOperationException( "HttpListener kullanmak için Windows XP SP2 veya Server 2003 veya daha yeni işletim sisteminde olmanız gerekir!" );
} Önekin / ileri eğimle bitmesi gerektiğini unutmayın string[] önekleri = yeni dize[] { "http://localhost:49152/" }; Bir dinleyici yaratın. HttpListener dinleyici = yeni HttpListener(); Monitörün ön ekini ekle. foreach (ön eklerde s dizi)
{ dinleyici. Önekler.Ekleme(ler);
} Dinlemeye başla dinleyici. Start(); Console.WriteLine("dinliyor..."); Doğrudur
{ Not: GetContext yöntemi, istek gelene kadar iş parçacığını engeller HttpListenerContext Context = dinleyici. GetContext(); İstek nesnesini alın HttpListenerRequest request = bağlam. Talep; Console.WriteLine("{0} {1} HTTP/1.1", request. HttpMethod, talep ediyorum. RawUrl); Console.WriteLine("Accept: {0}", string. Katıl(",", istek. AcceptTypes)); Console.WriteLine("Kabul Dili: {0}", ip. Katıl(",", istek. UserLanguages)); Console.WriteLine("User-Agent: {0}", request. UserAgent); Console.WriteLine("Accept-Encoding: {0}", request. başlıklar["Accept-Encoding"]); Console.WriteLine("Bağlantı: {0}", Talep. Devam et ki ? "Hayatta Kalmak" : "yakın"); Console.WriteLine("Host: {0}", request. UserHostName); Console.WriteLine("Pragma: {0}", request. Başlıklar["Pragma"]); Yanıt hedefini alın HttpListenerResponse yanıtı = bağlam. Yanıt; Yanıt içeriğini oluştur dize yanıtıString = @"<html> <head><title>HttpListener Sunucusu'ndan</title></head> <body><h1>Merhaba Dünya.</h1></body> ";</html> Yanıt başlığı içeriğini, uzunluğunu, kodlamasını ayarlayın Yanıt. ContentLength64 = System.Text.Encoding.UTF8.GetByteCount(responseString); Yanıt. ContentType = "metin/html; charset=UTF-8"; Çıkış yanıtları System.IO.Stream çıktısı = yanıt. OutputStream; System.IO.StreamWriter yazıcı = yeni System.IO.StreamWriter(çıktı); yazar. Write(responseString); Çıkış akışı kapatılmalıdır yazar. Close(); if (Console.KeyAvailable) mola;
} Sunucuyu kapat dinleyici. Dur();
HttpListener kullanıldığında, yaygın olarak kullanılan istek ve yanıt parametreleri nesne özelliklerine dönüşür ve bu da programlama iş yükünü büyük ölçüde azaltır. Ancak, parametrelerin çoğuna hâlâ Headers indeksleyicisi üzerinden erişilmesi gerekiyor; yukarıdaki örnekte olduğu gibi Accept-Encoding request parametresi gibi, ki bu parametrelere doğrudan özellikler üzerinden erişemiyoruz. |