17,740
社区成员
发帖
与我相关
我的任务
分享
private static void MainProcess(IAsyncResult ar)
{
var context = listener.EndGetContext(ar);
listener.BeginGetContext(MainProcess, null);
ThreadPool.QueueUserWorkItem(h =>
{
var response = context.Response;
response.AddHeader("Server", "My Server V0.0.1");
var request = context.Request;
........
可以是用 request.InputSteam 读取 post 来的 json 输入命令的等等,常见的 web 服务的简单输入输出,可以自己把握。
如果要接收复杂的参数,例如实现 Rfc 2396 格式的 post 数据,或许需要写100行代码。这已经算是很麻烦的了。而且这种东西不需要写几个。
平常自己写的高性能的服务器端代码,就是固定模式的输入输出,就跟写过 console 程序一样简单。 private static HttpListener listener;
public static void demo()
{
if (listener == null)
{
listener = new HttpListener();
var url = "http://+:9876/";
listener.Prefixes.Add(url);
listener.Start();
listener.BeginGetContext(MainProcess, null);
};
}
private static void MainProcess(IAsyncResult ar)
{
var context = listener.EndGetContext(ar);
listener.BeginGetContext(MainProcess, null);
var response = context.Response;
response.AddHeader("Server", "My Server V0.0.1");
var request = context.Request;
var path = request.Url.LocalPath;
if (path.StartsWith("/") || path.StartsWith("\\"))
path = path.Substring(1);
var sb = new StringBuilder("输入请求:");
sb.AppendLine(path);
var visit = path.Split(new char[] { '/', '\\' }, 2);
if (visit.Length > 0)
{
var cmd = visit[0].ToLower();
sb.AppendLine(string.Format("执行命令:{0}", cmd));
sb.AppendLine(string.Format("另外有{0}个参数", visit.Length - 1 + request.QueryString.Count));
}
sb.AppendLine(DateTime.Now.ToString());
response.ContentType = "text/plain;charset=UTF-8";
var result = Encoding.UTF8.GetBytes(sb.ToString());
using (var stream = response.OutputStream)
{
stream.Write(result, 0, result.Length);
}
}
运行之后,可以在浏览器试试 http://localhost:9876/abcd/aa.jsp?p=88sd&d=ksdf
你可以自己任意编写自己的 url 解析方式,跨过了低级的 http 处理,实现你自己的高级的处理机制。
显然,你自己部署一个 console控制台、wpf、windows service 程序,都可以自带有web服务器功能的!