Um den Listener für das Http-Protokoll weiter zu vereinfachen, stellt .net uns die Klasse HttpListener zur Verfügung, die (System.Net mit dem Namespace) .net eine Reihe von Aufgaben kapselt, die das Http-Protokoll verwalten.
Schauen wir uns zuerst die Definition in MSDN an:
Hinweis: Diese Klasse ist neu in .NET Framework Version 2.0.
Bietet einen einfachen, programmierbaren und steuerbaren HTTP-Protokoll-Listener. Es ist unmöglich, eine solche Klasse zu erben.
Verwendung:
öffentlich versiegelte Klasse HttpListener : IDisposable Hinweis: Diese Klasse kann nur auf Windows XP- oder Win Server 2003 oder neueren Betriebssystemen verwendet werden, da diese Klasse Http.sys Systemkomponenten verwenden muss, um die Aufgabe zu erledigen. Daher solltest du zunächst beurteilen, ob diese Klasse unterstützt wird, bevor du sie verwendest.
- / 检查系统是否支持
- if (!HttpListener.IsSupported)
- {
- throw new System.InvalidOperationException(
- "使用 HttpListener 必须为 Windows XP SP2 或 Server 2003 以上系统!");
- }
Code kopieren 2. Die Start()-Methode ermöglicht es dieser Instanz, eingehende Anfragen zu akzeptieren. Hör sofort zu
3. Die Stop()-Methode schließt das HttpListener-Objekt nach Verarbeitung aller aktuell in der Warteschlange stehenden Anfragen
4. Die GetContext()-Methode wartet darauf, dass die eingehende Anfrage zurückkehrt, wenn sie die Anfrage erhält. Wie der Socket-Implementierungsserver im vorherigen Artikel gibt es eine Accept()-Methode, von der beide fast auf eingehende Anfragen warten, und die GetContext()-Methode blockiert ebenfalls den Thread, und wenn die Client-Anfrage eintrifft, gibt sie ein HttpListenerContext-Objekt zurück, um die vom Client gesendete Anfrage zu verarbeiten. 4.1 Anfrage Erhalten Sie das HttpListenerRequest-Objekt, das die Client-Ressource repräsentiert.
4.1.1 AcceptType erhält den vom Client akzeptierten MIME-Typ. 4.1.2 UserLanguages Abruf von Sprachinformationen. 4.1.3 UserAgent erhält den vom Client bereitgestellten User Agent. 4.1.4 Header erhalten eine Sammlung von Header-Name/Wert-Paaren, die in einer Anfrage gesendet werden, ---> erhalten eine Eigenschaft, die nicht von der Klasse HttpListenerRequest bereitgestellt wird.
4.2 Response Diese Eigenschaft erhält ein HttpListenerResponse-Objekt, das dem Client als Antwort auf dessen Anfrage gesendet wird.
4.2.1 ContextLength64 Erhält oder setzt die Anzahl der Bytes an Körperdaten, die in der Antwort enthalten sind. 4.2.2 ContextType Erhält oder setzt den MIME-Typ des zurückgegebenen Inhalts.
Der Inhalt des Antwortnachrichtentextes wird per Streaming an den Client-Browser gesendet.
- //HTTP监听
- private HttpListener listeren = new HttpListener();
- #region 监听命令显示窗体
- /// <summary>
- /// 开启监听
- /// </summary>
- private void Init()
- {
- try
- {
- //指定身份验证 Anonymous匿名访问
- listeren.AuthenticationSchemes = AuthenticationSchemes.Anonymous;
- //创建IP地址
- IPAddress address = IPAddress.Parse(127.0.0.1);
- listeren.Prefixes.Add("http://" + address + ":30001/");
- listeren.Start();
- Thread threadlistener = new Thread(new ThreadStart(ThreadStartListener));
- threadlistener.Start();
- MessageBox.Show("监听成功");
- }
- catch (Exception ex)
- {
- cfg.Logs.Add(new LogClass { LogStr = "HttpListener error", ExInfo = ex });
- }
- }
-
- /// <summary>
- /// 监听连接线程
- /// </summary>
- private void ThreadStartListener()
- {
- try
- {
- while (true)
- {
- // 注意: GetContext 方法将阻塞线程,直到请求到达
- HttpListenerContext context = listeren.GetContext();
- // 取得请求对象
- HttpListenerRequest request = context.Request;
- Console.WriteLine("{0} {1} HTTP/1.1", request.HttpMethod, request.RawUrl);
- Console.WriteLine("Accept: {0}", string.Join(",", request.AcceptTypes));
- Console.WriteLine("Accept-Language: {0}",
- string.Join(",", request.UserLanguages));
- Console.WriteLine("User-Agent: {0}", request.UserAgent);
- Console.WriteLine("Accept-Encoding: {0}", request.Headers["Accept-Encoding"]);
- Console.WriteLine("Connection: {0}",
- request.KeepAlive ? "Keep-Alive" : "close");
- Console.WriteLine("Host: {0}", request.UserHostName);
- Console.WriteLine("Pragma: {0}", request.Headers["Pragma"]);
- // 取得回应对象
- HttpListenerResponse response = context.Response;
- // 构造回应内容
- string responseString
- = @"<html>
- <head><title>From HttpListener Server</title></head>
- <body><h1>Hello, 码农网(www.itsvse.com).</h1></body>
- </html>";
- // 设置回应头部内容,长度,编码
- response.ContentLength64
- = System.Text.Encoding.UTF8.GetByteCount(responseString);
- response.ContentType = "text/html; charset=UTF-8";
- // 输出回应内容
- System.IO.Stream output = response.OutputStream;
- System.IO.StreamWriter writer = new System.IO.StreamWriter(output);
- writer.Write(responseString);
- // 必须关闭输出流
- writer.Close();
- }
- }
- catch (Exception ex)
- {
- cfg.Logs.Add(new LogClass { LogStr = "HttpListener error", ExInfo = ex });
- }
- }
- #endregion
Code kopieren
|