What asp.net 没有端点的微服务核心项目

What asp.net Core project for MicroService without endpoint

我正在考虑 Docker 使用微服务框架。我见过许多公开端点的示例,这些端点会被某事调用以执行某事(让我了解某个位置的天气、货币汇率等)。我还没有看到任何关于如何替换我当前的 Windows 服务类型应用程序或订阅队列以完成其工作的应用程序的内容。

例如,假设我有一个 windows 服务,每天在 2:00 AM 压缩给定目录中的所有文件并将它们放入不同的目录(然后发布消息它已完成)。

我是否构建一个 asp.net 核心 "console app" 并添加一个 startup.cs?我的 main 中需要 startup.cs 还是只需要一个启动方法?

就像我说的,有很多关于构建微型 Web 响应的演示,但很少涉及如果我不这样做的话还能做什么 want/need 和端点。

Startup.cs 非常 ASP.NET 核心特定,它本身是一个网络堆栈,由 IIS 后面的 WebListener 或 Kestrel 托管。

在控制台应用程序中,您不会使用传统的 Startup.cs,尽管您可以拥有一致的基础,但它看起来会有点不同,因为您可以控制 IoC 容器的创建(而不是 ASP.NET Core 在 Web 应用程序中为您完成)。通常 Startup.cs 由 Program.cs 中的 WebHostBuilder 处理,以允许它在将 IServiceCollection 传递给 ConfigureServices 方法之前注入它自己的东西。

你是对的,你需要一个控制台应用程序,在那里你可以自己做所有的事情。

public class Program
{
    public IConfigurationRoot Configuration { get; private set; }
    public IServiceProvider Provider { get; private set; }

    public static void Main()
    {
        var programm = new Programm();
        program.Run();
    }

    private void Run() 
    {
        var builder = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
            .AddEnvironmentVariables();

        Configuration = builder.Build();

        var services = new ServiceCollection();
        ConfigureServices(services);
        this.Provider = services.BuildServiceProvider();

        var host = this.Provider.GetRequiredService<MyHost>();
        // blocking operation, the host should be something that keeps the service running
        // once it stops, the application stops too as there are no additional 
        host.Run();
    }

    private void ConfigureServices(IServiceCollection services) 
    {
        services.AddTransient<IMyService, MyService>();
        services.AddSingleton<MyHost>();
        ...
    }
}

您想使用什么作为主机,由您决定。它可能是一个 Azure Web Task/Host:

using(var jobHost = new JobHost(new JobHostConfiguration(Configuration.GetConnectionString("AzureWebJobsDashboard")))) 
{
    jobHost.RunAndBlock();
}

这将启动并保持应用程序 运行 并接收在其中注册的 Azure 消息和事件。或者您使用其他一些后台任务框架,例如 Hangfire。

在 ASP.NET Core 中,所有这些都由框架处理,但 ASP.NET Core 是为 Web 内容制作的,因此取决于端点。 ASP.NET 核心应用程序 Startup class 的 Configure 方法中的大部分内容都是关于注册中间件的,这些中间件在 HttpContext 上工作。您在微服务 w/o 端点中没有这些。没有端点,没有 HttpContext,不需要中间件。

当然,您在控制台应用程序中也没有 IApplicationBuilder,只有 IServiceProvider 来解析您之前注册的服务。