Tento článek je zrcadlovým článkem o strojovém překladu, klikněte zde pro přechod na původní článek.

Pohled: 20804|Odpověď: 0

[Zdroj] .net implementuje jednoduchý webový server pomocí HttpListener

[Kopírovat odkaz]
Zveřejněno 08.12.2015 14:55:12 | | | |


Pro další zjednodušení posluchače pro protokol Http poskytuje .net třídu HttpListener, která (System.Net s jmenným prostorem) .net zapouzdřuje sérii úloh zpracovávajících protokol Http.

Podívejme se nejdříve na definici v MSDN:

Poznámka: Tato třída je nová ve verzi .NET Framework 2.0.



Poskytuje jednoduchý, programovatelný a ovladatelný posluchač HTTP protokolu. Takovou třídu nelze zdědit.

Zvyk:

veřejná uzavřená třída HttpListener : IDisposable
Poznámka: Tato třída může být použita pouze na operačních systémech Win XP nebo Win Server 2003 či novějších, protože tato třída musí používat Http.sys systémové komponenty, aby byla splněna.
Proto byste měli nejprve posoudit, zda je tato třída podporována, než ji použijete

  1. / 检查系统是否支持
  2.             if (!HttpListener.IsSupported)
  3.             {
  4.                 throw new System.InvalidOperationException(
  5.                     "使用 HttpListener 必须为 Windows XP SP2 或 Server 2003 以上系统!");
  6.             }
Kopírovat kód
2. Metoda Start() umožňuje této instanci přijímat příchozí požadavky. Poslouchej hned

3. Metoda Stop() uzavře objekt HttpListener po zpracování všech aktuálně zařazených požadavků

4. Metoda GetContext() čeká, až se příchozí požadavek vrátí, když požadavek přijme. Stejně jako server implementace socketu v předchozím článku existuje metoda Accept(), obě téměř čekají na příchozí požadavky, a metoda GetContext() také zablokuje vlákno, a když dorazí požadavek klienta, vrátí objekt HttpListenerContext, který zpracuje požadavek odeslaný klientem.
    4.1 Požadavek Získejte objekt HttpListenerRequest, který reprezentuje klientský zdroj.

          4.1.1 Přijmout Typ získá MIME typ přijatý klientem.
4.1.2 UserLanguages Získejte informace o jazycích.
          4.1.3 UserAgent získává uživatelského agenta poskytnutého klientem.
          4.1.4 Hlavičky Získejte kolekci dvojic jména/hodnota hlaviček zaslaných v požadavku ---> získání vlastnosti, která není poskytována třídou HttpListenerRequest.

4.2 Odpověď Tato vlastnost získá objekt HttpListenerResponse, který je klientovi odeslán na jeho požadavek.

4.2.1 ContextLength64 Získá nebo nastaví počet bajtů tělesných dat zahrnutých v odpovědi.
          4.2.2 ContextType Získá nebo nastaví MIME typ vráceného obsahu.

Obsah těla odpovědi je do klientského prohlížeče odeslán streamováním.


  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
Kopírovat kód







Předchozí:WPF zavírá okna a procesy
Další:Nechte svůj WPF program vykreslovat Win8 stylové motivy pod Win7
Zřeknutí se:
Veškerý software, programovací materiály nebo články publikované organizací Code Farmer Network slouží pouze k učení a výzkumu; Výše uvedený obsah nesmí být používán pro komerční ani nelegální účely, jinak nesou všechny důsledky uživatelé. Informace na tomto webu pocházejí z internetu a spory o autorská práva s tímto webem nesouvisí. Musíte výše uvedený obsah ze svého počítače zcela smazat do 24 hodin od stažení. Pokud se vám program líbí, podporujte prosím originální software, kupte si registraci a získejte lepší skutečné služby. Pokud dojde k jakémukoli porušení, kontaktujte nás prosím e-mailem.

Mail To:help@itsvse.com