应用程序类型

在 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);
}