Web服务器HttpServer(嵌入式设备)

HttpServer是一个轻量级Web服务器,用于在嵌入式设备以及客户端环境中提供简单Web服务。

HttpServer支持路由映射到匿名委托、WebApi接口、静态文件,以及具有多个接口的控制器类。从简单到复杂,控制权交给开发者。

源码:https://github.com/NewLifeX/X/blob/master/NewLife.Core/Http/HttpServer.cs

Nuget:NewLife.Core

Get Started

准备好vs2022,新建.NET6.0控制台项目

从nuget引用 NewLife.Core 包,找到包后点击安装,将会安装最新版

打开源码文件 Program.cs ,输入以下例程,该例程将会监听8080端口提供Web服务,并打开所有日志,映射了4个不同的路由。

using NewLife.Http;
using NewLife.Log;
using NewLife.Remoting;XTrace.UseConsole();var server = new HttpServer
{Port = 8080,Log = XTrace.Log,SessionLog = XTrace.Log
};
server.Map("/", () => "<h1>Hello NewLife!</h1></br> " + DateTime.Now.ToFullString() + "</br><img src=\"logos/leaf.png\" />");
server.Map("/user", (String act, Int32 uid) => new { code = 0, data = $"User.{act}({uid}) success!" });
server.MapStaticFiles("/logos", "images/");
server.MapController<ApiController>("/api");
server.Start();Console.ReadLine();

点击绿色三角箭头启动调试,或者按F5快捷键启动

vs2022将会自动编译源码并启动应用,弹出控制台窗口

控制台日志显示,网络应用程序已经开始监听8080端口,分别在IPv4和IPv6上同时监听。

通过浏览器访问 http://localhost:8080/ ,可以得到以下页面。

这是第一个路由映射的HTML页面。(图片文件没有放到相应目录下,所以没显示)

普通Html

HttpServer支持路由映射到一个返回html字符串的匿名方法

server.Map("/", () => "<h1>Hello NewLife!</h1></br> " + DateTime.Now.ToFullString() + "</br><img src=\"logos/leaf.png\" />");

路由路径为/,也就是根目录。这个匿名函数很简单,没有参数(也可以有参数),返回字符串。服务端就认为返回的是html文本。

如果返回类型是Byte[]或者Stream等二进制数据,则使用 application/octet-stream 类型。

如果处理函数内部抛出异常,则服务端将向浏览器返回500错误。

Api接口

HttpServer支持路由到WebApi接口,支持从url截取参数,支持POST自定义Json格式参数。

server.Map("/user", (String act, Int32 uid) => new { code = 0, data = $"User.{act}({uid}) success!" });

访问地址 http://localhost:8080/user?act=edit&uid=1234 得到

路由路径是/user。该接口返回一个对象,HttpServer将进行json序列化后返回。

静态文件

HttpServer支持路由到静态文件,可通过http访问指定目录下所有静态文件。

server.MapStaticFiles("/logos", "images/");

路由路径是/logos,指向当前目录的images子目录下的文件。

例如前面html中访问 /logos/leaf.png ,实际上指向 images/leaf.png ,需要在 images 子目录下放置 leaf.png 文件。从 http://x.newlifex.com/leaf.png 下载图片,放到images目录下,当然也可以用自己的图片。选中leaf.png文件,下方属性窗的复制到输出目录,选择“如果较新则复制”。

按F5再次跑起来项目,访问 http://localhost:8080/ 。

从日志可以看到,请求根目录/后,html里面img再次请求 /logos/leaf.png 图片。

HttpServer仅支持常用文件类型的MineType。

注意:静态文件处理器实现比较简单,可以下载dll和config等任意文件,但路径上做了限制,禁止跳出本地目录。

接口控制器

HttpServer支持映射到控制器类,内部所有公开实例方法作为下级路由。

server.MapController<ApiController>("/api");

路由路径/api映射控制器ApiController下所有公开接口。该类下共有 All/Info/Info2 几个接口。

访问路径 http://localhost:8080/api/info 可以看到:

本质上就是映射 /api/info 到 ApiController 内部的 Info 方法。

专用处理器IHttpHandler

HttpServer 对上述功能的支持,本质上就是把路由映射到 IHttpHandler 实现。因为完全可以通过自定义 IHttpHandler 实现来达到完全自定义Http处理的效果。

IHttpHandler 接口只有一个成员方法 ProcessRequest,传入 IHttpContext 上下文。上下文中有Request请求和Response响应。

namespace NewLife.Http
{//// 摘要://     Http处理器public interface IHttpHandler{//// 摘要://     处理请求//// 参数://   context:void ProcessRequest(IHttpContext context);}
}

编写一下例程:

class MyHttpHandler : IHttpHandler
{public void ProcessRequest(IHttpContext context){var name = context.Parameters["name"];var html = $"<h2>你好,<span color=\"red\">{name}</span></h2>";context.Response.SetResult(html);}
}

context.Parameters中有解析好的Url参数,Response.SetResult设置响应数据和MineType类型。

然后在Programe.cs中增加映射

server.Map("/my", new MyHttpHandler());

按F5启动,访问地址 http://localhost:8080/my?name=Stone 。

树莓派跑起来

部署到树莓派(这里不深入如何安装.NET6.0)

然后 curl 跑起来

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/299185.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RFileWriteStream 写入汉字

由于用到 RFileWriteStream 写入汉字到文件中&#xff0c;之前没有处理过&#xff0c;等写入文件后才发现是乱码。 问了问群里的朋友也没有解决&#xff0c;后来就上网搜&#xff0c;终于找到一个解决方法&#xff0c;就是用 CCnvCharacterSetConverter 类 这个类是用来转换Uni…

mysql同时查两张表数据库表_如何同时查询两个数据库表?

展开全部 sql多表关联查询跟条件查询大同小异,主要是要知道表与表之前的关系很重e69da5e6ba9062616964757a686964616f31333431353238要; 举例说明:(某数据库中有3张表分别为:userinfo,dep,sex) userinfo(用户信息表)表中有三个字段分别为:user_di(用户编号),user_name(用…

200万年薪,招不到清华姚班毕业生,能上姚班的都是什么人?

全世界只有3.14 % 的人关注了爆炸吧知识清华姚班可能很多人都没有听说过&#xff0c;不是我们孤陋寡闻&#xff0c;而是姚班确实是不一般的存在。即便是在清华&#xff0c;姚班的学霸也是可以碾压其他学霸的。在清华有一句话&#xff0c;半国英才聚清华&#xff0c;清华半英在姚…

[分享]我国食品行业ERP现状及分析解决方案

一。食品行业介绍&#xff1a;  我国食品行业是一个竞争非常激烈的行业&#xff0c;平均利润率很低&#xff0c;但市场空 间巨大&#xff0c;产销均有大幅提高的空间。在今后发展中&#xff0c;食品的消费与需求将完成由追求数量向追求质量、营养、安全、多样和方便型的转…

分布式拒绝服务攻击(DDoS)原理及防范

转自:http://www.cnblogs.com/rootq/archive/2009/11/06/1597215.html http://www.ibm.com/developerworks/cn/security/se-ddos/ 2002 年 6 月 01 日 分布式拒绝服务攻击&#xff08;DDoS&#xff09;是目前黑客经常采用而难以防范的攻击手段。本文从概念开始详细介绍了这种攻…

Blazor 应用如何使用 Azure Active Directory 认证登录

点击上方蓝字 / 关注“汪宇杰博客”原文&#xff1a;Azure Tips and Tricks翻译&#xff1a;汪宇杰使用 Azure Active Directory 保护您的应用程序您可以使用 Azure Active Directory (AAD) 让用户进行身份验证并授权使用您的应用。AAD 提供了一种智能身份即服务来保护您的应用…

python notebook右侧网页_《Python web开发》笔记 一:网页开发基础

网页基础知识网页的构成网页由html、css和Javascript构成&#xff0c;html是框架&#xff0c;CSS是样式和装饰&#xff0c;JS则是各项功能实现。我们把网页的组成类比成一栋房子&#xff0c;Html相当于房子的结构&#xff0c;CSS相当于房子的装修装饰&#xff0c;JavaScript相当…

jQuery中this与$(this)区别

起初以为this和$(this)就是一模子刻出来。但是我在阅读时&#xff0c;和coding时发现,总不是一回事。 What is "this"? In many object-oriented programming languages, this (or self) is a keyword which can be used in instance methods to refer to the objec…

推荐几个超有趣的公众号

全世界只有3.14 % 的人关注了爆炸吧知识想要和别人有聊不完的话题&#xff1f;当然是多读书多看新闻了解新鲜有趣的事物啦如果你没有时间去阅读那么关注以下公号将会让你收获更多信息~长按下方二维码选择“识别图中二维码”订阅疯狂历史ID&#xff1a;fkhistory▼ 简介&#xf…

省钱之道--图解域域树域林根域的含义

如图&#xff1a;contoso这家公司的IT环境中有很多类型的IT资源&#xff0c;而目前这些IT资源都处于一个分散管理的状态中&#xff0c;这样无形中增加了contoso这家公司的管理成本&#xff0c;而且管理制度没有办法落实到实际的生产环境中去。那么&#xff0c;如何解决这个问题…

动态表单实现客户端二次过滤及字段汇总统计

最终效果动态表单 1、表格分录首行出现客户端二次过滤行2、表格分录最后一行出现汇总行实现代码转载于:https://www.cnblogs.com/fyq891014/p/4188779.html

SqlBulkCopy只支持SQL Server? EF Core实现支持多数据库类型的Bulk Copy

前言Microsoft SQL Server包含一个名为bcp的命令行实用工具&#xff0c;可以将较大文件快速大容量复制到SQL Server数据库的表或视图中&#xff0c;这种方法被称为Bulk Copy(批量复制)。Bulk Copy相比与循环插入有很大的性能优势&#xff0c;网上有很多测试文章&#xff0c;这里…

小小一招解决“INSERT EXEC 语句不能嵌套”的问题

先看代码CreateProcedureup_test1 asSelect1111--这里没有问题 goCreateProcedureup_test2 AScreatetable#tt (a Varchar(4)) insertinto#tt Execup_test1 goCreateProcedureup_test3 asCreateTable#ttt (b varchar(4)) InsertInto#ttt Execup_…

word2013插入excel对象报错_在Word文档中修改嵌入的Excel对象

好吧,我做到了!感谢Remou发布的链接。在我跨过最初的障碍后,它确实提供了一些支持。。。这是我的代码:WordApp.Documents.Open("C:\Report.docx")Dim iOLE As Int16Dim oSheet As ObjectDim oOLE As ObjectFor iOLE 1 To WordApp.ActiveDocument.Content.ShapeRange…

取消IE不允许下载文件的提示

首先&#xff0c;要在迅雷“配置”——监视——在“监视浏览器”勾选&#xff08;要新版本的老版本没有此项&#xff0c;如果你使用的迅雷没有此项&#xff0c;点击帮助里面的“检查更新”升级既可&#xff09;&#xff0c;在设置里选“使用迅雷作为默认的下载工具”&#xff0…

让TA们告诉你,疫情当下如何更彪悍的成长

全世界只有3.14 % 的人关注了爆炸吧知识真正决定人与人之间的差距的&#xff0c;其实是我们对事物的见识与内心的格局&#xff0c;见识的深浅决定人生的深浅&#xff0c;格局的大小决定了人生之路是宽是窄。今天给大家推荐几个有深度、有想法的公众号&#xff0c;希望能够给你带…

WEB前端开发规范

为什么80%的码农都做不了架构师&#xff1f;>>> 一、文件命名规范 images //图片资源&#xff0c;如果项目多人开发里面还需要用子文件夹分开fonts //字体资源&#xff0c;一般就是特殊字体嵌入或者图标字体styles //CSS文件- app.css //reset样式,如果项目小…

Execute .NET Code under SQL Server 2005

http://www.codeproject.com/KB/database/Managed_Code_in_SQL.aspx转载于:https://www.cnblogs.com/OceanChen/archive/2010/07/22/1783091.html

MySQL调用mongodb事务回滚_SpringBoot整合MongoDB,在多数据源下实现事务回滚。

项目中用到了MongoDB&#xff0c;准备用来存储业务数据&#xff0c;前提是要实现事务&#xff0c;保证数据一致性&#xff0c;MongoDB从4.0开始支持事务&#xff0c;提供了面向复制集的多文档事务特性。能满足在多个操作&#xff0c;文档&#xff0c;集合&#xff0c;数据库之间…

Goreplay来做流量回放

最近做项目&#xff0c;用到goreplay来做流量回放&#xff0c;什么是goreplay&#xff1f;GoReplay is an open-source network monitoring tool which can record your live traffic, and use it for shadowing, load testing, monitoring and detailed analysis.本质上就是通…