You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
102 lines
2.6 KiB
102 lines
2.6 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Threading;
|
|
using System.Net;
|
|
|
|
namespace Apewer.Web
|
|
{
|
|
|
|
/// <summary></summary>
|
|
public class HttpListener
|
|
{
|
|
|
|
private System.Net.HttpListener _listener;
|
|
private Thread _thread;
|
|
private string _prefix = "http://*:0/";
|
|
|
|
/// <summary></summary>
|
|
public Action<HttpListenerContext> Action { get; set; }
|
|
|
|
/// <summary></summary>
|
|
public string Prefix
|
|
{
|
|
get { return _prefix; }
|
|
set { _prefix = value ?? ""; }
|
|
}
|
|
|
|
/// <summary></summary>
|
|
public Exception Start()
|
|
{
|
|
var prefix = Prefix;
|
|
Logger.Web.Info(this, $"准备在 {Prefix} 启动。");
|
|
|
|
_listener = new System.Net.HttpListener();
|
|
try
|
|
{
|
|
_listener.AuthenticationSchemes = AuthenticationSchemes.Anonymous;
|
|
_listener.Prefixes.Add(prefix);
|
|
_listener.Start();
|
|
|
|
// 多线程方式处理请求。
|
|
// _thread = new Thread(Listen);
|
|
// _thread.IsBackground = true;
|
|
// _thread.Start();
|
|
|
|
// 异步方式处理请求。
|
|
_listener.BeginGetContext(Received, null);
|
|
|
|
Logger.Web.Info(this, $"已在 {prefix} 启动。");
|
|
return null;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Logger.Web.Exception(ex, this);
|
|
Logger.Web.Info(this, $"在 {prefix} 启动失败。");
|
|
return ex;
|
|
}
|
|
}
|
|
|
|
/// <summary></summary>
|
|
public void Stop()
|
|
{
|
|
if (_thread != null)
|
|
{
|
|
// _thread.Abort();
|
|
_thread = null;
|
|
}
|
|
|
|
if (_listener != null)
|
|
{
|
|
_listener.Close();
|
|
_listener.Stop();
|
|
_listener = null;
|
|
}
|
|
}
|
|
|
|
void Received(IAsyncResult ar)
|
|
{
|
|
_listener.BeginGetContext(Received, null);
|
|
|
|
var context = _listener.EndGetContext(ar);
|
|
var action = Action;
|
|
if (action != null) action(context);
|
|
}
|
|
|
|
void Listen()
|
|
{
|
|
while (true)
|
|
{
|
|
if (_listener == null) break;
|
|
|
|
var context = _listener.GetContext();
|
|
var action = Action;
|
|
if (action == null) continue;
|
|
action(context);
|
|
// RuntimeUtility.InBackground(() => action(context), true);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|