应用程序类型
在 ASP.NET Core 项目模板中,每个项目都会有 一大堆的初始化代码,它们分散在 Program.cs和Startup.cs 文件中, .net6虽然可以合并在一起,但内容几乎没有减少。
直接使用这种项目模板会带来有3个问题:
- 每个项目都有 Program.cs和Startup.cs 这2文件,且内容大体上类似!
- 每个项目的 Startup.cs中的 ConfigureServices,Configure 方法不仅类似,而且又臭又长!
- 如果项目中需要引入一种新的组件,每个Startup.cs文件又要添加一样的内容!
当然了,我们也应该要认识到,这并不是 ASP.NET Core 的问题,它的项目模板支撑单个Web应用程序是没有问题的, 这些问题之所以会出现,是因为和微服务架构有关,微服务的数量越多,上面说的3个问题就越明显!
Nebula为了解决这些问题,将 Program.cs和Startup.cs 2个文件中的代码压缩成一个方法调用,即:
public class Program
{
public static void Main(string[] args)
{
AppStartup.RunAsXXXXX("ApplicationName", args);
}
}
XXXXX 就是以下4种应用程序类型:
-
WebSite(Web站点)
- 允许对外公开的站点,HttpAction 需要做授权检查
- 加载Razor页面所需组件,支持静态页面访问,占用内存较多
-
PublicServices(外部服务)
- 允许对外公开的服务,HttpAction 需要做授权检查
- 不支持 Razor页面和静态页面,内存占用比 Website 低
- 建议用做 RESTful 数据接口服务
-
InternalServices(内部服务)
- 为了安全隔离,仅供内部使用(不对外公开),HttpAction 可以不做授权检查
- 不支持 Razor页面和静态页面,内存占用比 Website 低
- 建议用做 内部使用的 RESTful 数据接口服务
-
Console(控制台应用)
- 不-提供HTTP访问接口,运行环境稳定且不容易被攻击
- 由于不加载ASP.NET Core的那些组件,因此 占用内存最少
- 建议使用场景:MQ的消费者程序,后台作业。
前3类应用在创建时,都需要选择 ASP.NET Core Web 应用程序项目模板。
选择建议
- 如果需要支持 Razor 页面,请选择 WebSite 类型
- 前后端分离 的项目,请选择 PublicServices 类型
- 给第三方应用提供数据来源的WebApi服务,请选择 PublicServices 类型
- 返回敏感数据的WebApi服务,请选择 InternalServices 类型,且不提供外网访问权限
- 不需要对外访问的WebApi服务,请选择 InternalServices 类型,且不提供外网访问权限
- 处理消息订阅(MessageHandler),请选择 Console 类型
- 执行后台任务(BackgroundTask),请选择 Console 类型
代码执行主体 和 应用程序类型 的关系
代码执行主体 和 应用程序类型 是二个不同层级的事物,
- 代码执行主体:是一个代码片段
- 应用程序类型:是一个项目类别
根据前面描述
- MessageHandler,BackgroundTask 由于不需要监听HTTP端口,所以可以适用于以上4种应用程序类型
- 但是:建议将 MessageHandler,BackgroundTask 独立到单独的项目中,并使用 Console 应用程序类型
行为差异
Website/PublicServices/InternalServices 这3类程序都属于Web应用程序,
它们在一些细节处理上存在差异:
- Website
- 支持登录身份凭证续期自动处理
- Action结果做JSON序列化时
- DateTime输出格式 yyyy-MM-dd HH:mm:ss
- 包含 NULL 值成员
- PublicServices
- 支持登录身份凭证续期自动处理
- Action结果做JSON序列化时
- DateTime输出格式 yyyy-MM-ddTHH:mm:ss.FFFFFFFK
- 忽略 NULL 值成员
- InternalServices
- 【不】支持登录身份凭证续期自动处理
- 对于未处理的异常,响应内容会包含异常详细内容,即:startOption.AlwaysShowFullException = true;
- Action结果做JSON序列化时
- DateTime输出格式 yyyy-MM-ddTHH:mm:ss.FFFFFFFK
- 忽略 NULL 值成员
如果需要调整JSON序列时DateTime的输出格式,可参考以下代码
public static void Main(string[] args)
{
AppStartOption startOption = new AppStartOption {
// 设置JSON序列化的时间格式
DateFormatString = "yyyy-MM-dd HH:mm:ss"
};
AppStartup.RunAsPublicServices("OneTestService", args, startOption);
}