Šis straipsnis yra veidrodinis mašininio vertimo straipsnis, spauskite čia norėdami pereiti prie originalaus straipsnio.

Rodinys: 20804|Atsakyti: 0

[Šaltinis] .net įgyvendina paprastą žiniatinklio serverį naudojant HttpListener

[Kopijuoti nuorodą]
Paskelbta 2015-12-08 14:55:12 | | | |


Siekiant dar labiau supaprastinti Http protokolo klausytoją, .net pateikia mums HttpListener klasę, kuri (System.Net vardų sritimi) .net apima daugybę užduočių, kurios tvarko Http protokolą.

Pirmiausia pažvelkime į MSDN apibrėžimą:

Pastaba: Ši klasė yra nauja .NET Framework 2.0 versijoje.



Suteikia paprastą, programuojamą ir valdomą HTTP protokolo klausytuvą. Tokios klasės paveldėti neįmanoma.

Naudojimo:

viešas uždarytas klasė HttpListener : IDisposable
Pastaba: Ši klasė gali būti naudojama tik Win XP arba Win Server 2003 ar naujesnėse operacinėse sistemose, nes ši klasė turi naudoti Http.sys sistemos komponentus, kad atliktų darbą.
Todėl prieš naudodami pirmiausia turėtumėte įvertinti, ar ši klasė palaikoma

  1. / 检查系统是否支持
  2.             if (!HttpListener.IsSupported)
  3.             {
  4.                 throw new System.InvalidOperationException(
  5.                     "使用 HttpListener 必须为 Windows XP SP2 或 Server 2003 以上系统!");
  6.             }
Kopijuoti kodą
2. Start() metodas leidžia šiam egzemplioriui priimti gaunamas užklausas. Klausykite nedelsdami

3. Stop() metodas uždaro HttpListener objektą apdorojus visas šiuo metu eilėje esančias užklausas

4. GetContext() metodas laukia, kol gaunama užklausa grįš, kai gaus užklausą Kaip ir ankstesniame straipsnyje pateiktas "Socket" diegimo serveris, yra "Accept()" metodas, kuris abu beveik laukia gaunamų užklausų, o "GetContext()" metodas taip pat užblokuos giją, o kai bus gauta kliento užklausa, jis grąžins "HttpListenerContext" objektą, kad apdorotų kliento atsiųstą užklausą.
    4.1 Užklausa Gaukite HttpListenerRequest objektą, kuris atspindi kliento išteklius.

          4.1.1 AcceptType Gauna kliento priimtą MIME tipą.
4.1.2 UserLanguages Gaukite kalbos informaciją.
          4.1.3 "UserAgent" gauna kliento pateiktą vartotojo agentą.
          4.1.4 Antraštės Gaukite antraštės pavadinimų ir reikšmių porų rinkinį, atsiųstą užklausoje---> gautumėte ypatybę, kurios nepateikia HttpListenerRequest klasė.

4.2 Atsakymas Ši ypatybė gauna objektą HttpListenerResponse, kuris bus išsiųstas klientui atsakant į kliento užklausą.

4.2.1 ContextLength64 Gauna arba nustato į atsakymą įtrauktų kūno duomenų baitų skaičių.
          4.2.2 ContextType Gauna arba nustato grąžinto turinio MIME tipą.

Atsakymo pranešimo turinys siunčiamas į kliento naršyklę srautiniu būdu.


  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
Kopijuoti kodą







Ankstesnis:WPF uždaro langus ir procesus
Kitą:Leiskite savo WPF programai atvaizduoti Win8 stiliaus temas pagal Win7
Atsakomybės apribojimas:
Visa programinė įranga, programavimo medžiaga ar straipsniai, kuriuos skelbia Code Farmer Network, yra skirti tik mokymosi ir mokslinių tyrimų tikslams; Aukščiau nurodytas turinys negali būti naudojamas komerciniais ar neteisėtais tikslais, priešingu atveju vartotojai prisiima visas pasekmes. Šioje svetainėje pateikiama informacija gaunama iš interneto, o ginčai dėl autorių teisių neturi nieko bendra su šia svetaine. Turite visiškai ištrinti aukščiau pateiktą turinį iš savo kompiuterio per 24 valandas nuo atsisiuntimo. Jei jums patinka programa, palaikykite autentišką programinę įrangą, įsigykite registraciją ir gaukite geresnes autentiškas paslaugas. Jei yra kokių nors pažeidimų, susisiekite su mumis el. paštu.

Mail To:help@itsvse.com