Тази статия е огледална статия за машинен превод, моля, кликнете тук, за да преминете към оригиналната статия.

Изглед: 20804|Отговор: 0

[Източник] .net реализира прост уеб сървър с помощта на HttpListener

[Копирай линк]
Публикувано в 8.12.2015 г. 14:55:12 ч. | | | |


За да опростим още повече слушателя за Http протокола, .net ни предоставя класа HttpListener, който (System.Net с пространството от имена) .net капсулира серия от задачи, обработващи Http протокола.

Нека първо разгледаме дефиницията в MSDN:

Забележка: Този клас е нов в .NET Framework версия 2.0.



Предоставя прост, програмируем и управляем слушател на HTTP протокол. Невъзможно е да се наследи такъв клас.

Използване:

публично запечатан клас HttpListener : IDisposable
Забележка: Този клас може да се използва само на операционни системи Win xp или Win Server 2003 или по-нови, тъй като този клас трябва да използва Http.sys системни компоненти, за да свърши работата.
Затова първо трябва да прецените дали този курс е подкрепен, преди да го използвате

  1. / 检查系统是否支持
  2.             if (!HttpListener.IsSupported)
  3.             {
  4.                 throw new System.InvalidOperationException(
  5.                     "使用 HttpListener 必须为 Windows XP SP2 或 Server 2003 以上系统!");
  6.             }
Копирай код
2. Методът Start() позволява на този инстанс да приема входящи заявки. Слушай веднага

3. Методът Stop() затваря обекта HttpListener след обработка на всички текущо опашени заявки

4. Методът GetContext() изчаква входящата заявка да се върне, когато получи заявката. Точно както сървърът за имплементация на Socket в предишната статия, съществува метод Accept(), като и двата почти чакат входящи заявки, а методът GetContext() също блокира нишката, а когато заявката на клиента пристигне, ще върне обект HttpListenerContext, за да обработи заявката, изпратена от клиента.
    4.1 Заявка Получаване на обекта HttpListenerRequest, който представлява клиентския ресурс.

          4.1.1 AcceptType Получава MIME типа, приет от клиента.
4.1.2 Потребителски езици Получаване на езикова информация.
          4.1.3 UserAgent получава потребителския агент, предоставен от клиента.
          4.1.4 Заглавия Получавате колекция от двойки име/стойност на заглавие, изпратени в заявка, ---> получавате свойство, което не е предоставено от класа HttpListenerRequest.

4.2 Response Това свойство получава обект HttpListenerResponse, който ще бъде изпратен на клиента в отговор на заявката на клиента.

4.2.1 ContextLength64 Получава или задава броя байтове от основните данни, включени в отговора.
          4.2.2 ContextType Получава или задава MIME типа на върнатото съдържание.

Съдържанието на тялото на отговорното съобщение се изпраща към клиентския браузър чрез стрийминг.


  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
Копирай код







Предишен:WPF затваря прозорци и процеси
Следващ:Нека вашата WPF програма рендерира теми в стил Win8 под Win7
Отричане:
Целият софтуер, програмни материали или статии, публикувани от Code Farmer Network, са само за учебни и изследователски цели; Горното съдържание не трябва да се използва за търговски или незаконни цели, в противен случай потребителите ще понесат всички последствия. Информацията на този сайт идва от интернет, а споровете за авторски права нямат нищо общо с този сайт. Трябва напълно да изтриете горното съдържание от компютъра си в рамките на 24 часа след изтеглянето. Ако ви харесва програмата, моля, подкрепете оригинален софтуер, купете регистрация и получете по-добри услуги. Ако има нарушение, моля, свържете се с нас по имейл.

Mail To:help@itsvse.com