### 2022-02-21更新

------
#### MyDbV4    V3.0.2202.2101
- *.[新增]新增HttpServer类,可以非常方便的建立http服务器。
This commit is contained in:
鑫Intel 2022-02-21 17:16:51 +08:00
parent 4282403900
commit 6342b9db9d
37 changed files with 590 additions and 6 deletions

View File

@ -8550,6 +8550,95 @@
CookieCollection格式的Cookie集合同时也返回String类型的cookie
</summary>
</member>
<member name="T:RyWeb.HttpServer">
<summary>
Http服务器类
</summary>
</member>
<member name="T:RyWeb.HttpServer.HttpRequestHandler">
<summary>
</summary>
<param name="sender"></param>
<param name="e"></param>
</member>
<member name="E:RyWeb.HttpServer.OnHandleGETRequest">
<summary>
当收到Get事件时激发
</summary>
</member>
<member name="E:RyWeb.HttpServer.OnHandlePOSTRequest">
<summary>
当收到Post事件时激发
</summary>
</member>
<member name="P:RyWeb.HttpServer.ListenerHost">
<summary>
监听的主机,默认是localhost
</summary>
</member>
<member name="P:RyWeb.HttpServer.ErrorMessage">
<summary>
最后一次错误信息
</summary>
</member>
<member name="M:RyWeb.HttpServer.#ctor(System.Int32)">
<summary>
在此端口建立Http服务类
</summary>
<param name="port">端口号</param>
</member>
<member name="M:RyWeb.HttpServer.IsRunning">
<summary>
</summary>
<returns></returns>
</member>
<member name="M:RyWeb.HttpServer.Start">
<summary>
开始服务
</summary>
</member>
<member name="M:RyWeb.HttpServer.Exit">
<summary>
退出服务
</summary>
</member>
<member name="M:RyWeb.HttpServer.Finalize">
<summary>
</summary>
</member>
<member name="T:RyWeb.HttpRequest">
<summary>
</summary>
</member>
<member name="P:RyWeb.HttpRequest.Url">
<summary>
</summary>
</member>
<member name="P:RyWeb.HttpRequest.PostData">
<summary>
</summary>
</member>
<member name="P:RyWeb.HttpRequest.UrlReferrer">
<summary>
</summary>
</member>
<member name="P:RyWeb.HttpRequest.ReturnHtml">
<summary>
</summary>
</member>
<member name="P:RyWeb.HttpRequest.StatusCode">
<summary>
</summary>
</member>
<member name="T:RyWeb.QuickWeb">
<summary>

View File

@ -1,2 +1,2 @@
[Money_Op]
hwnd=921334
hwnd=3813034

View File

@ -1,4 +1,4 @@
<root>
<list id="LastUpdateTime" Value="2022/1/27 15:20:41" />
<list id="LastUpdateTime" Value="2022/2/21 16:14:44" />
<list id="UpdateAfterTime" Value="0" />
</root>

View File

@ -8550,6 +8550,95 @@
CookieCollection格式的Cookie集合同时也返回String类型的cookie
</summary>
</member>
<member name="T:RyWeb.HttpServer">
<summary>
Http服务器类
</summary>
</member>
<member name="T:RyWeb.HttpServer.HttpRequestHandler">
<summary>
</summary>
<param name="sender"></param>
<param name="e"></param>
</member>
<member name="E:RyWeb.HttpServer.OnHandleGETRequest">
<summary>
当收到Get事件时激发
</summary>
</member>
<member name="E:RyWeb.HttpServer.OnHandlePOSTRequest">
<summary>
当收到Post事件时激发
</summary>
</member>
<member name="P:RyWeb.HttpServer.ListenerHost">
<summary>
监听的主机,默认是localhost
</summary>
</member>
<member name="P:RyWeb.HttpServer.ErrorMessage">
<summary>
最后一次错误信息
</summary>
</member>
<member name="M:RyWeb.HttpServer.#ctor(System.Int32)">
<summary>
在此端口建立Http服务类
</summary>
<param name="port">端口号</param>
</member>
<member name="M:RyWeb.HttpServer.IsRunning">
<summary>
</summary>
<returns></returns>
</member>
<member name="M:RyWeb.HttpServer.Start">
<summary>
开始服务
</summary>
</member>
<member name="M:RyWeb.HttpServer.Exit">
<summary>
退出服务
</summary>
</member>
<member name="M:RyWeb.HttpServer.Finalize">
<summary>
</summary>
</member>
<member name="T:RyWeb.HttpRequest">
<summary>
</summary>
</member>
<member name="P:RyWeb.HttpRequest.Url">
<summary>
</summary>
</member>
<member name="P:RyWeb.HttpRequest.PostData">
<summary>
</summary>
</member>
<member name="P:RyWeb.HttpRequest.UrlReferrer">
<summary>
</summary>
</member>
<member name="P:RyWeb.HttpRequest.ReturnHtml">
<summary>
</summary>
</member>
<member name="P:RyWeb.HttpRequest.StatusCode">
<summary>
</summary>
</member>
<member name="T:RyWeb.QuickWeb">
<summary>

View File

@ -8523,6 +8523,95 @@
CookieCollection格式的Cookie集合同时也返回String类型的cookie
</summary>
</member>
<member name="T:RyWeb.HttpServer">
<summary>
Http服务器类
</summary>
</member>
<member name="T:RyWeb.HttpServer.HttpRequestHandler">
<summary>
</summary>
<param name="sender"></param>
<param name="e"></param>
</member>
<member name="E:RyWeb.HttpServer.OnHandleGETRequest">
<summary>
当收到Get事件时激发
</summary>
</member>
<member name="E:RyWeb.HttpServer.OnHandlePOSTRequest">
<summary>
当收到Post事件时激发
</summary>
</member>
<member name="P:RyWeb.HttpServer.ListenerHost">
<summary>
监听的主机,默认是localhost
</summary>
</member>
<member name="P:RyWeb.HttpServer.ErrorMessage">
<summary>
最后一次错误信息
</summary>
</member>
<member name="M:RyWeb.HttpServer.#ctor(System.Int32)">
<summary>
在此端口建立Http服务类
</summary>
<param name="port">端口号</param>
</member>
<member name="M:RyWeb.HttpServer.IsRunning">
<summary>
</summary>
<returns></returns>
</member>
<member name="M:RyWeb.HttpServer.Start">
<summary>
开始服务
</summary>
</member>
<member name="M:RyWeb.HttpServer.Exit">
<summary>
退出服务
</summary>
</member>
<member name="M:RyWeb.HttpServer.Finalize">
<summary>
</summary>
</member>
<member name="T:RyWeb.HttpRequest">
<summary>
</summary>
</member>
<member name="P:RyWeb.HttpRequest.Url">
<summary>
</summary>
</member>
<member name="P:RyWeb.HttpRequest.PostData">
<summary>
</summary>
</member>
<member name="P:RyWeb.HttpRequest.UrlReferrer">
<summary>
</summary>
</member>
<member name="P:RyWeb.HttpRequest.ReturnHtml">
<summary>
</summary>
</member>
<member name="P:RyWeb.HttpRequest.StatusCode">
<summary>
</summary>
</member>
<member name="T:RyWeb.QuickWeb">
<summary>

View File

@ -8523,6 +8523,95 @@
CookieCollection格式的Cookie集合同时也返回String类型的cookie
</summary>
</member>
<member name="T:RyWeb.HttpServer">
<summary>
Http服务器类
</summary>
</member>
<member name="T:RyWeb.HttpServer.HttpRequestHandler">
<summary>
</summary>
<param name="sender"></param>
<param name="e"></param>
</member>
<member name="E:RyWeb.HttpServer.OnHandleGETRequest">
<summary>
当收到Get事件时激发
</summary>
</member>
<member name="E:RyWeb.HttpServer.OnHandlePOSTRequest">
<summary>
当收到Post事件时激发
</summary>
</member>
<member name="P:RyWeb.HttpServer.ListenerHost">
<summary>
监听的主机,默认是localhost
</summary>
</member>
<member name="P:RyWeb.HttpServer.ErrorMessage">
<summary>
最后一次错误信息
</summary>
</member>
<member name="M:RyWeb.HttpServer.#ctor(System.Int32)">
<summary>
在此端口建立Http服务类
</summary>
<param name="port">端口号</param>
</member>
<member name="M:RyWeb.HttpServer.IsRunning">
<summary>
</summary>
<returns></returns>
</member>
<member name="M:RyWeb.HttpServer.Start">
<summary>
开始服务
</summary>
</member>
<member name="M:RyWeb.HttpServer.Exit">
<summary>
退出服务
</summary>
</member>
<member name="M:RyWeb.HttpServer.Finalize">
<summary>
</summary>
</member>
<member name="T:RyWeb.HttpRequest">
<summary>
</summary>
</member>
<member name="P:RyWeb.HttpRequest.Url">
<summary>
</summary>
</member>
<member name="P:RyWeb.HttpRequest.PostData">
<summary>
</summary>
</member>
<member name="P:RyWeb.HttpRequest.UrlReferrer">
<summary>
</summary>
</member>
<member name="P:RyWeb.HttpRequest.ReturnHtml">
<summary>
</summary>
</member>
<member name="P:RyWeb.HttpRequest.StatusCode">
<summary>
</summary>
</member>
<member name="T:RyWeb.QuickWeb">
<summary>

View File

@ -1,4 +1,9 @@
### 2022-02-20更新
### 2022-02-21更新
------
#### MyDbV4 V3.0.2202.2101
- *.[新增]新增HttpServer类,可以非常方便的建立http服务器。
### 2022-02-20更新
------
#### MyDbV4 V3.0.2202.2001
- *.[新增]WebDecode类新增UrlToData和GetParam函数。

View File

@ -93,7 +93,6 @@ namespace Itrycn_Project2
{
Application.Exit();
}
private void FrmStart_Shown(object sender, EventArgs e)
{
ryCommon.Ini ini = new Ini(Soft_ConstInfo.UserDataFolder + "\\Win.dat");

View File

@ -136,6 +136,7 @@
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Include="RyWeb\HttpHelper.cs" />
<Compile Include="RyWeb\HttpServer.cs" />
<Compile Include="RyWeb\QuickWeb.cs" />
<Compile Include="RyWeb\WebDecode.cs" />
<Compile Include="SafeCheck\AES.cs" />

View File

@ -32,5 +32,5 @@ using System;
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值,
// 方法是按如下所示使用“*”: :
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("3.0.2202.2001")]
[assembly: AssemblyFileVersion("3.0.2202.2001")]
[assembly: AssemblyVersion("3.0.2202.2101")]
[assembly: AssemblyFileVersion("3.0.2202.2101")]

View File

@ -0,0 +1,223 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading;
namespace RyWeb
{
/// <summary>
/// Http服务器类
/// </summary>
public class HttpServer
{
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public delegate void HttpRequestHandler(object sender, HttpRequest e);
/// <summary>
/// 当收到Get事件时激发
/// </summary>
[Description("当收到Get事件时激发")]
public event HttpRequestHandler OnHandleGETRequest;
/// <summary>
/// 当收到Post事件时激发
/// </summary>
[Description("当收到Post事件时激发")]
public event HttpRequestHandler OnHandlePOSTRequest;
private HttpListener listener;
private Thread httpThread;
private volatile bool stopped = false;
/// <summary>
/// 监听的主机,默认是localhost
/// </summary>
public string ListenerHost { get; set; } = "localhost";
private int port = 19955;
/// <summary>
/// 最后一次错误信息
/// </summary>
public string ErrorMessage { get;internal set; } = "";
/// <summary>
/// 在此端口建立Http服务类
/// </summary>
/// <param name="port">端口号</param>
public HttpServer(int port)
{
isrunning = false;
stopped = false;
try
{
listener = new HttpListener();
this.port= port;
listener.Prefixes.Add("http://"+ ListenerHost + ":" + port + "/");
//listener.Prefixes.Add(HTTPS_PREFIX + HTTPS_PORT + "/");
listener.Start();
httpThread = new Thread(new ThreadStart(Run));
httpThread.Start();
isrunning = true;
}
catch(Exception ex) { ErrorMessage = ex.Message; }
}
private bool isrunning = false;
/// <summary>
///
/// </summary>
/// <returns></returns>
public bool IsRunning()
{
return isrunning;
}
/// <summary>
/// 开始服务
/// </summary>
public void Start()
{
isrunning = false;
stopped = false;
try
{
if (listener == null || !listener.IsListening)
{
listener = new HttpListener();
listener.Prefixes.Add("http://"+ ListenerHost + ":" + port + "/");
//listener.Prefixes.Add(HTTPS_PREFIX + HTTPS_PORT + "/");
listener.Start();
}
if (httpThread == null || httpThread.ThreadState != ThreadState.Running)
{
httpThread = new Thread(new ThreadStart(Run));
httpThread.Start();
}
isrunning = true;
}
catch(Exception ex) { ErrorMessage = ex.Message; }
}
/// <summary>
/// 退出服务
/// </summary>
public void Exit()
{
stopped = true;
try
{
if (listener != null)
{
listener.Stop();
listener.Close();
}
if (httpThread != null)
{
httpThread.Interrupt();
}
listener = null;
httpThread = null;
}
catch (Exception ex) { ErrorMessage = ex.Message; }
isrunning = false;
}
/// <summary>
///
/// </summary>
~HttpServer()
{
Exit();
}
private void Run()
{
while (!stopped)
{
try
{
var r = listener.BeginGetContext(new AsyncCallback(RequestHandler), listener);
r.AsyncWaitHandle.WaitOne();
r.AsyncWaitHandle.Close();
}
catch (ThreadInterruptedException e1) { ErrorMessage = e1.Message; }
catch (HttpListenerException e2)
{
ErrorMessage = e2.Message;
}
}
}
private void RequestHandler(IAsyncResult r)
{
try
{
_RequestHandler(r);
}
catch (Exception e)
{
ErrorMessage = e.Message;
}
}
private void _RequestHandler(IAsyncResult r)
{
if (stopped) return;
var l = (HttpListener)r.AsyncState;
var ctx = l.EndGetContext(r);
var req = ctx.Request;
var resp = ctx.Response;
var html = "";
if(req.HttpMethod=="GET")
{
HttpRequest e = new HttpRequest();
e.Url = req.Url;
e.UrlReferrer = req.UrlReferrer;
OnHandleGETRequest?.Invoke(this,e);
resp.StatusCode = (int)e.StatusCode;
html = e.ReturnHtml;
}
else if(req.HttpMethod=="POST")
{
HttpRequest e = new HttpRequest
{
Url = req.Url,
UrlReferrer = req.UrlReferrer
};
var sr = new StreamReader(req.InputStream, Encoding.GetEncoding("GB2312"));
e.PostData= sr.ReadToEnd();
sr.Close();
OnHandlePOSTRequest?.Invoke(this, e);
resp.StatusCode = (int)e.StatusCode;
html = e.ReturnHtml;
}
var buffer = Encoding.UTF8.GetBytes(html);
resp.ContentLength64 = buffer.Length;
resp.OutputStream.Write(buffer, 0, buffer.Length);
var outs = resp.OutputStream;
outs.Close();
resp.Close();
}
}
/// <summary>
///
/// </summary>
public class HttpRequest
{
/// <summary>
///
/// </summary>
public Uri Url { get; internal set; }
/// <summary>
///
/// </summary>
public string PostData { get; internal set; } = "";
/// <summary>
///
/// </summary>
public Uri UrlReferrer { get; internal set; }
/// <summary>
///
/// </summary>
public string ReturnHtml { get; set; } = "";
/// <summary>
///
/// </summary>
public HttpStatusCode StatusCode { get; set; } = HttpStatusCode.OK;
}
}