最后更新: 2025/06/17
(github)https://github.com/mirrortom/MyWebApiCore
项目基于.NET9.0的ASP.NET CORE空项目模板.实现分析url,映射到类的方法上,执行方法回应请求.是一个简单的webapi功能框架.
映射逻辑是,在程序启动时,搜索程序集内所有符合约定的类和方法,将以类名和方法名组成的url,和以类和方法的信息,放入一个字典中,以url为键,类和方法信息为值,建立映射关系.
当程序收到http请求时,将分析url,到映射字典里查找对应的类和方法,执行方法响应请求.
下面的文件放在项目的core文件夹.
作为处理请求的类和方法,需要继承ApiBase类,处理方法上要贴有http请求类型的特性.
class Demo1 : ApiBase { [HTTPGET] public async Task Getinfo(){} }
默认规则是"类名/方法名"组成,也可以自定义路由.用特性的参数加入.
class Demo2 : ApiBase { [HTTPGET] // 自定义路由 [ROUTE("api/demo/indexReLoad")] public async Task Getinfo(){} }
程序编译成功后,直接F5运行.可以通过控制台窗口查看服务器信息.服务器监听端口是http://localhost:50000.浏览器打开这个地址,测试页面里有各种功能测试.
将core文件夹和配置文件,以及启动文件复制到项目.或者将这个项目的启动文件写成方法,然后编译成DLL,引用到项目.
由IIS做监听,请求转发到kestrel. (文档)https://learn.microsoft.com/zh-cn/aspnet/core/host-and-deploy/iis/out-of-process-hosting?view=aspnetcore-8.0
<?xml version="1.0" encoding="utf-8"?> <configuration> <location path="." inheritInChildApplications="false"> <system.webServer> <handlers> <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" /> </handlers> // 进程名字是自己项目的 <aspNetCore processPath=".\项目名字.exe" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" // 要使用进程外托管. hostingModel="outofprocess"/> </system.webServer> </location> </configuration>
托管方式也可以在项目的.csproj里添加 <AspNetCoreHostingModel>OutOfProcess[InProcess]</AspNetCoreHostingModel>来说明进程外(内)托管.这样项目发布后,web.config文件中的托管方式值会以设定的值生成.
部署成服务时,可以当成一个本地程序,就像控制台程序但没有黑窗口.可用本机网页做交互UI.文档:https://learn.microsoft.com/zh-cn/aspnet/core/host-and-deploy/windows-service?view=aspnetcore-8.0&tabs=visual-studio
可以用sc命令启动/停止服务: sc start/stop [SrvName]
静态文件参考文档: https://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/static-files?view=aspnetcore-8.0
静态文件的默认目录是 wwwroot ,位于目录 {content root}/wwwroot
调用无参数系统中间件 UseStaticFiles() 方法重载将启用静态文件功能, 提供wwwroot目录中的文件.
调用有参数的 UseStaticFiles(StaticFileOptions[]).参数里指定了一个物理目录和对应的虚拟目录.
这个功能可以在kestrel服务器建立虚拟目录.例如内容根下的一个目录 "/contentRoot/img" 虚拟目录 "/cdn/img"
指定一个文件在网址打开时不带url时显示.例如 index.html
调用系统中间件 UseDefaultFiles(DefaultDocOptions) 参数方法可以添加多个默认文档.
asp.net core基础概念文档:https://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/?view=aspnetcore-7.0&tabs=windows
从core2.1到.net8,水平差依然是觉得复杂看不明白.现在8.0文档比较丰富,感觉有点思路了.开始有一个主机,这是所有东西的容器(Host类),是封装应用资源的对象.比如主机管理配置信息/环境变量/日志,可以添加服务(IServiceCollection)/web主机(IWebHostBuilder)等.web主机也是容器,是提供web服务的,可以选择一种监听服务器,比如Kestrel(默认)或者IIS,也可以自定义服务器.web服务器可以承载应用程序IApplicationBuilder,应用程序里面就是功能模块MiddleWare.
(.NET)https://learn.microsoft.com/zh-cn/dotnet/core/extensions/configuration
配置途径真是五花八门,感觉选择愈多越麻烦,只想找一个最简单的方法.最后使用json文件方式
// 系统自带的解析配置类 IConfiguration config = new ConfigurationBuilder() .AddJsonFile("settings.json") .Build(); // 支持索引器取json里的值还算比较方便 支持数组和KV // {key:"val1",key2:{key21:21}} config.GetValue<string>("key") 或 config["key"] config.GetValue<int>("key2:key21") // 21 // {vers:[1,2,3,4,5]} config.GetValue<int>("vers:0") // 1 // {psnode:[{k:1,v:1},{k:2,v:2},...]} 取一个数组转化成字典数组 config.GetSection("psnode").Get<Dictionary<string, string>[]>();
(文档)https://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/middleware/?view=aspnetcore-7.0
实现功能的程序,比如解析URL,处理异常,跨域等,都是通过加载中间件实现.系统已经内置了很多中间件,直接选用就行.需要实现特定功能就做一个中间件.
若干中间件组成管道处理链条,顺序很重要.比如异常中间件需要在其它中间件之前加载,否则异常出现了,异常处理中间件还没加载.静态文件中间件要在动态处理中间件之前加载.
中间件执行完会执行下一个,传递HttpContext对象.有些不会传递,比如静态文件中间件,请求到静态文件中间件后,如果找到了页面,就会返回页面,中止请求,这个是中间件短路.加载自定义中间件的方法是Use(),如果要加载一个短路中间件,可以使用Run(),一般最后一个中间件可以用Run()加载.
新版的Asp.Net需要了解的C#相关知识. Delegate 泛型 async异步方法 依赖注入DI Task 异常处理 反射 序列化
Asp.Net Core与经典的asp.net的差别比较大了,功能上感觉更先进,也更复杂.Asp.Net Core是一个可以承载多种功能的容器平台了,不再仅仅是web服务.