Ta članek je zrcalni članek strojnega prevajanja, kliknite tukaj za skok na izvirni članek.

Pogled: 20804|Odgovoriti: 0

[Vir] .net implementira preprost spletni strežnik z uporabo HttpListenerja

[Kopiraj povezavo]
Objavljeno na 8. 12. 2015 14:55:12 | | | |


Da bi še dodatno poenostavili poslušalec za Http protokol, .net ponuja razred HttpListener, ki (System.Net imenskega prostora) .net zajema vrsto nalog, ki obravnavajo Http protokol.

Najprej si poglejmo definicijo v MSDN:

Opomba: Ta razred je nov v .NET Framework različici 2.0.



Nudi preprost, programabilen in nadzorovan poslušalec HTTP protokola. Takšen razred je nemogoče podedovati.

Navada:

javni zaprti razred HttpListener : IDisposable
Opomba: Ta razred je mogoče uporabljati le na operacijskih sistemih Win XP ali Win Server 2003 ali novejših, saj mora ta razred uporabljati Http.sys sistemske komponente za opravljanje naloge.
Zato morate najprej presoditi, ali je ta razred podprt, preden ga uporabite

  1. / 检查系统是否支持
  2.             if (!HttpListener.IsSupported)
  3.             {
  4.                 throw new System.InvalidOperationException(
  5.                     "使用 HttpListener 必须为 Windows XP SP2 或 Server 2003 以上系统!");
  6.             }
Kopiraj kodo
2. Metoda Start() omogoča tej instanci sprejemanje dohodnih zahtev. Poslušaj takoj

3. Metoda Stop() zapre objekt HttpListener po obdelavi vseh trenutno čakalnih zahtev

4. Metoda GetContext() počaka, da se dohodna zahteva vrne, ko jo prejme. Tako kot strežnik za implementacijo socketa v prejšnjem članku obstaja metoda Accept(), ki skoraj čakata na dohodne zahteve, metoda GetContext() pa prav tako blokira nit, in ko prispe zahtevek odjemalca, vrne objekt HttpListenerContext, ki obdela zahtevo, ki jo pošlje odjemalec.
    4.1 Zahteva: Pridobi objekt HttpListenerRequest, ki predstavlja odjemalski vir.

          4.1.1 Sprejmi, tip pridobi MIME tip, ki ga sprejme odjemalec.
4.1.2 UserLanguages Pridobi informacije o jeziku.
          4.1.3 UserAgent pridobi uporabniškega agenta, ki ga zagotovi odjemalec.
          4.1.4 Glave Pridobite zbirko parov imena in vrednosti glave, poslanih v zahtevi ---> pridobite lastnost, ki je ne zagotavlja razred HttpListenerRequest.

4.2 Odziv Ta lastnost prejme objekt HttpListenerResponse, ki bo poslan odjemalcu kot odgovor na zahtevo odjemalca.

4.2.1 ContextLength64 Dobi ali nastavi število bajtov telesnih podatkov, vključenih v odgovor.
          4.2.2 ContextType Dobi ali nastavi MIME tip vrnjene vsebine.

Vsebina telesa odgovornega sporočila se pošlje v brskalnik odjemalca s pretočnim prenosom.


  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
Kopiraj kodo







Prejšnji:WPF zapira okna in procese
Naslednji:Naj vaš WPF program upodablja teme v slogu Win8 pod Win7
Disclaimer:
Vsa programska oprema, programski materiali ali članki, ki jih izdaja Code Farmer Network, so namenjeni zgolj učnim in raziskovalnim namenom; Zgornja vsebina ne sme biti uporabljena v komercialne ali nezakonite namene, sicer uporabniki nosijo vse posledice. Informacije na tej strani prihajajo z interneta, spori glede avtorskih pravic pa nimajo nobene zveze s to stranjo. Zgornjo vsebino morate popolnoma izbrisati z računalnika v 24 urah po prenosu. Če vam je program všeč, podprite pristno programsko opremo, kupite registracijo in pridobite boljše pristne storitve. Če pride do kakršne koli kršitve, nas prosimo kontaktirajte po elektronski pošti.

Mail To:help@itsvse.com