代码之家  ›  专栏  ›  技术社区  ›  mclayton

向现有辅助服务项目添加ASPNET API

  •  0
  • mclayton  · 技术社区  · 5 年前

    我目前有一个dotnet5.0工作者服务项目,它托管一个后台服务,定期执行一个业务流程。我设法摸索着在一个房间里安排了一个主人 CreateHostBuilder 方法,并且作为docker容器中的可执行文件,这一切都运行良好。

    ConfigureServices 方法绑定到在我指定的端口上的ASPNET razor项目中定义的类,但在多次尝试之后,我有点纠结于如何开始处理这个问题,更不用说让它实际工作了:-(。

    我的工人.csproj

    <Project Sdk="Microsoft.NET.Sdk.Worker">
    
      <PropertyGroup>
        <TargetFramework>net5.0</TargetFramework>
      </PropertyGroup>
    
      <ItemGroup>
        <PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="5.0.0" />
        <PackageReference Include="Microsoft.Extensions.Hosting" Version="5.0.0" />
        <PackageReference Include="Serilog.Extensions.Hosting" Version="4.0.0-dev-00051" />
        <PackageReference Include="Serilog.Formatting.Compact" Version="1.1.1-dev-00940" />
        <PackageReference Include="Serilog.Sinks.Console" Version="4.0.0-dev-00839" />
      </ItemGroup>
    
      <ItemGroup>
        <ProjectReference Include="..\MyAppCode\MyAppCode.csproj" />
      </ItemGroup>
    
    </Project>
    

    和一个 程序.cs 看起来是这样的:

            public static void Main(string[] args)
            {
    
                Program.InitSerilog();
                Program.CreateHostBuilder(args).Build().Run();
    
            }
    
            public static void InitSerilog()
            {
                ... do stuff ...
            }
    
            public static IHostBuilder CreateHostBuilder(string[] args)
            {
                return new HostBuilder()
                    // worker service config
                    .ConfigureLogging((context, builder) =>
                    {
                        builder.SetMinimumLevel(LogLevel.Trace);
                    })
                    .ConfigureServices(services =>
                    {
                        services.AddHostedService<MyAppService>();
                        services.AddSingleton<AppSettings>(
                            serviceProvider => { return Program.CreateAppSettings(); }
                        );
                    })
                    .UseSerilog();
            }
    
            private static AppSettings CreateAppSettings()
            {
                ... bind to environment variables and return ...
            }
    
        }
    

        public sealed class MyAppService: BackgroundService
        {
    
            public MyAppService(ILogger<MyAppService> logger, AppSettings appSettings)
                : base()
            {
                ... do stuff ...
            }
    
            protected override async Task ExecuteAsync(CancellationToken stoppingToken)
            {
                ... keep doing the main business process in a timed loop ...
            }
    
            #endregion
        }
    

    我找到了很多示例,说明如何将辅助服务添加到现有的ASPNET项目,或者如何将ASPNET项目作为Windows服务宿主,但没有找到任何关于如何将ASPNET站点侦听器添加到现有辅助服务的示例。

    喜欢 我们要做的就是在一个新的c#项目中构建WebUI/api,并以某种方式将其插入现有的c#项目中程序.cs所以它在主后台服务运行时监听指定的端口,但也许我只是走错路了?

    CreateHostBuilder 方法,所以请随时告诉我将其恢复为默认值,如果这是一个简单的答案:-)。

    感谢您的帮助/指点。。。

    0 回复  |  直到 5 年前
        1
  •  3
  •   nunohpinheiro    5 年前

    首先,我建议你改变主意 <Project Sdk="Microsoft.NET.Sdk.Worker"> 进入之内 <Project Sdk="Microsoft.NET.Sdk.Web">

    CreateHostBuilder Startup 班级:

    public static IHostBuilder CreateHostBuilder(string[] args)
    {
        return new HostBuilder()
            .ConfigureLogging((context, builder) =>
            {
                builder.SetMinimumLevel(LogLevel.Trace);
            })
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            })
            .UseSerilog();
    }
    

    在你的

    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }
        
        public IConfiguration Configuration { get; }
        
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddHttpContextAccessor();
            services.AddAuthorization();
    
            // worker service config
            services.AddHostedService<MyAppService>();
            services.AddSingleton<AppSettings>(
                serviceProvider => { return Program.CreateAppSettings(); } // this method could be relocated too
            );
    
            // example for health checks
            services.AddHealthChecks();
        }
    
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            
            app.UseRouting();
            app.UseAuthorization();
            app.UseEndpoints(endpoints =>
            {
                // example for health checks
                endpoints.MapHealthChecks("/health", new HealthCheckOptions
                {
                    Predicate = _ => true,
                    ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse
                });
            });
        }
    }