Bu makale makine çevirisi ayna makalesidir, orijinal makaleye geçmek için lütfen buraya tıklayın.

Görünüm: 20804|Yanıt: 0

[Kaynak] .net, HttpListener kullanarak basit bir web sunucusu uygular

[Bağlantıyı kopyala]
Yayınlandı 8.12.2015 14:55:12 | | | |


Http protokolü için dinleyiciyi daha da basitleştirmek amacıyla, .net bize HttpListener sınıfını sağlar; bu sınıf (isim uzayıyla System.Net) .net, Http protokolünü yöneten bir dizi görevi kapsar.

Önce MSDN'deki tanıma bakalım:

Not: Bu sınıf .NET Framework sürüm 2.0'da yenidir.



Basit, programlanabilir ve kontrol edilebilir bir HTTP protokol dinleyicisi sağlar. Böyle bir sınıfı miras almak imkansızdır.

Kullanım:

public mühürlü sınıf HttpListener : IDisposable
Not: Bu sınıf yalnızca Win xp veya Win Server 2003 veya daha sonraki işletim sistemlerinde kullanılabilir, çünkü bu sınıf işi tamamlamak için Http.sys sistem bileşenlerini kullanmak zorundadır.
Bu nedenle, önce bu sınıfın desteklenip desteklenmediğine karar vermelisiniz

  1. / 检查系统是否支持
  2.             if (!HttpListener.IsSupported)
  3.             {
  4.                 throw new System.InvalidOperationException(
  5.                     "使用 HttpListener 必须为 Windows XP SP2 或 Server 2003 以上系统!");
  6.             }
Kopya kodu
2. Start() yöntemi, bu örneğin gelen istekleri kabul etmesini sağlar. Hemen dinle

3. Stop() yöntemi, şu anda sırada olan tüm istekler işlendikten sonra HttpListener nesnesini kapatır

4. GetContext() yöntemi, gelen isteğin isteği aldığında geri dönmesini bekler Önceki makaledeki Socket uygulama sunucusunda olduğu gibi, neredeyse gelen istekler için bekleyen bir Accept() yöntemi vardır ve GetContext() yöntemi de iş parçacığını engeller; istemcinin isteği geldiğinde, istemci tarafından gönderilen isteği işlemek için bir HttpListenerContext nesnesi döndürür.
    4.1 İstek İstemci kaynağını temsil eden HttpListenerRequest nesnesini edin.

          4.1.1 AcceptType İstemci tarafından kabul edilen MIME tipini elde eder.
4.1.2 UserLanguages: Dil bilgisini edinin.
          4.1.3 UserAgent, istemci tarafından sağlanan kullanıcı ajanını elde eder.
          4.1.4 Başlıklar: HttpListenerRequest sınıfı tarafından sağlanmayan bir özellik almak ---> bir istek gönderilen başlık adı/değer çiftlerinden oluşan bir koleksiyonu alın.

4.2 Yanıt Bu özellik, istemcinin talebine yanıt olarak istemciye gönderilecek bir HttpListenerResponse nesnesi alır.

4.2.1 ContextLength64 Yanıta dahil edilen gövde verisi sayısını alır veya ayarlar.
          4.2.2 ContextType Geri dönen içeriğin MIME tipini alır veya ayarlar.

Yanıt mesajı gövdesinin içeriği, yayın yoluyla istemci tarayıcısına gönderilir.


  1. //HTTP监听
  2. private HttpListener listeren = new HttpListener();


  3.         #region 监听命令显示窗体
  4.         /// <summary>
  5.         /// 开启监听
  6.         /// </summary>
  7.         private void Init()
  8.         {
  9.             try
  10.             {
  11.                 //指定身份验证 Anonymous匿名访问
  12.                 listeren.AuthenticationSchemes = AuthenticationSchemes.Anonymous;
  13.                 //创建IP地址
  14.                 IPAddress address = IPAddress.Parse(127.0.0.1);
  15.                 listeren.Prefixes.Add("http://" + address + ":30001/");
  16.                 listeren.Start();
  17.                 Thread threadlistener = new Thread(new ThreadStart(ThreadStartListener));
  18.                 threadlistener.Start();
  19.                 MessageBox.Show("监听成功");
  20.             }
  21.             catch (Exception ex)
  22.             {
  23.                 cfg.Logs.Add(new LogClass { LogStr = "HttpListener error", ExInfo = ex });
  24.             }
  25.         }
  26.         
  27.          /// <summary>
  28.         /// 监听连接线程
  29.         /// </summary>
  30.         private void ThreadStartListener()
  31.         {
  32.             try
  33.             {
  34.                 while (true)
  35.             {
  36.                 // 注意: GetContext 方法将阻塞线程,直到请求到达
  37.                 HttpListenerContext context = listeren.GetContext();
  38.                 // 取得请求对象
  39.                 HttpListenerRequest request = context.Request;
  40.                 Console.WriteLine("{0} {1} HTTP/1.1", request.HttpMethod, request.RawUrl);
  41.                 Console.WriteLine("Accept: {0}", string.Join(",", request.AcceptTypes));
  42.                 Console.WriteLine("Accept-Language: {0}",
  43.                     string.Join(",", request.UserLanguages));
  44.                 Console.WriteLine("User-Agent: {0}", request.UserAgent);
  45.                 Console.WriteLine("Accept-Encoding: {0}", request.Headers["Accept-Encoding"]);
  46.                 Console.WriteLine("Connection: {0}",
  47.                     request.KeepAlive ? "Keep-Alive" : "close");
  48.                 Console.WriteLine("Host: {0}", request.UserHostName);
  49.                 Console.WriteLine("Pragma: {0}", request.Headers["Pragma"]);
  50.                 // 取得回应对象
  51.                 HttpListenerResponse response = context.Response;
  52.                 // 构造回应内容
  53.                 string responseString
  54.                     = @"<html>
  55.                         <head><title>From HttpListener Server</title></head>
  56.                         <body><h1>Hello, 码农网(www.itsvse.com).</h1></body>
  57.                         </html>";
  58.                 // 设置回应头部内容,长度,编码
  59.                 response.ContentLength64
  60.                     = System.Text.Encoding.UTF8.GetByteCount(responseString);
  61.                 response.ContentType = "text/html; charset=UTF-8";
  62.                 // 输出回应内容
  63.                 System.IO.Stream output = response.OutputStream;
  64.                 System.IO.StreamWriter writer = new System.IO.StreamWriter(output);
  65.                 writer.Write(responseString);
  66.                 // 必须关闭输出流
  67.                 writer.Close();
  68.             }
  69.             }
  70.             catch (Exception ex)
  71.             {
  72.                 cfg.Logs.Add(new LogClass { LogStr = "HttpListener error", ExInfo = ex });
  73.             }
  74.         }
  75.         #endregion
Kopya kodu







Önceki:WPF pencereleri kapatır ve süreçleri
Önümüzdeki:WPF programınızın Win7 altında Win8 tarzı temaları render etmesine izin verin
Feragatname:
Code Farmer Network tarafından yayımlanan tüm yazılım, programlama materyalleri veya makaleler yalnızca öğrenme ve araştırma amaçları içindir; Yukarıdaki içerik ticari veya yasa dışı amaçlarla kullanılamaz, aksi takdirde kullanıcılar tüm sonuçları ödemelidir. Bu sitedeki bilgiler internetten alınmakta olup, telif hakkı anlaşmazlıklarının bu siteyle hiçbir ilgisi yoktur. Yukarıdaki içeriği indirmeden sonraki 24 saat içinde bilgisayarınızdan tamamen silmelisiniz. Programı beğendiyseniz, lütfen orijinal yazılımı destekleyin, kayıt satın alın ve daha iyi orijinal hizmetler alın. Herhangi bir ihlal olursa, lütfen bizimle e-posta yoluyla iletişime geçin.

Mail To:help@itsvse.com