如何在没有HTTP请求的情况下在MVC Core应用中启动HostedService

飞行员

在我的MVC .NET core 2.2应用程序中,有HostedService负责后台工作。

在Startap类的ConfigureServices方法中注册

services.AddHostedService<Engines.KontolerTimer>();

由于这是独立于用户请求的后台服务,因此我想在应用启动时立即启动我的后台服务。现在是我的HostedService在第一个用户请求后开始凝视的情况。

启动MVC Core应用程序时启动HostedService的正确方法是什么

我的秘密看起来像这样一个https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-2.2

internal class TimedHostedService : IHostedService, IDisposable
{
    private readonly ILogger _logger;
    private Timer _timer;

    public TimedHostedService(ILogger<TimedHostedService> logger)
    {
        _logger = logger;
    }

    public Task StartAsync(CancellationToken cancellationToken)
    {
        _logger.LogInformation("Timed Background Service is starting.");

        _timer = new Timer(DoWork, null, TimeSpan.Zero, 
            TimeSpan.FromSeconds(5));

        return Task.CompletedTask;
    }

    private void DoWork(object state)
    {
        _logger.LogInformation("Timed Background Service is working.");
    }

    public Task StopAsync(CancellationToken cancellationToken)
    {
        _logger.LogInformation("Timed Background Service is stopping.");

        _timer?.Change(Timeout.Infinite, 0);

        return Task.CompletedTask;
    }

    public void Dispose()
    {
        _timer?.Dispose();
    }
}

看起来我根本无法启动应用程序。

我的porgram CS看起来像

public class Program
    {
        public static void Main(string[] args)
        {
           CreateWebHostBuilder(args).Build().Run();


        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
            .UseSerilog((ctx, config) => { config.ReadFrom.Configuration(ctx.Configuration); })
            .UseStartup<Startup>();
    }

在第一个用户请求之前,我没有遇到任何中断点。我错过了什么吗,这是VS2017创建的默认.Net Core应用程序

这是我的starup.cs

public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }
        private Models.Configuration.SerialPortConfiguration serialPortConfiguration;

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.Configure<CookiePolicyOptions>(options =>
            {
                // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                options.CheckConsentNeeded = context => true;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });

            services.AddDbContext<ApplicationDbContext>(options =>
                options.UseSqlServer(
                    Configuration.GetConnectionString("DefaultConnection")));

            services.AddIdentity<ApplicationUser, ApplicationRole>(options => options.Stores.MaxLengthForKeys = 128)
                .AddDefaultUI(UIFramework.Bootstrap4)
                .AddEntityFrameworkStores<ApplicationDbContext>()
                .AddDefaultTokenProviders();

            services.AddDbContext<Data.Parking.parkingContext>(options =>
                options.UseSqlServer(
                    Configuration.GetConnectionString("DefaultConnection")));


         services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
            services.AddHostedService<Engines.KontolerTimer>();}
柯克·拉金(Kirk Larkin)

使用Visual Studio运行此程序时,可能会使用IIS Express,直到发出第一个请求时,IIS Express才会运行ASP.NET Core项目(这实际上就是IIS默认情况下的工作方式)。这在使用ASP.NET Core 2.2新增的InProcess托管模型时适用,我希望您必须使用它才能看到此问题。有关更多信息,请参见此GitHub问题

您可以通过从用于承载ASP.NET Core应用程序的.csproj文件中删除AspNetCoreHostingModel XML元素来证明这一理论,该文件将切换回OutOfProcess模式。在VS2017的项目属性对话框的“调试”下,似乎有一个“托管模型”选项,如果您不想直接编辑.csproj,则可以将其更改为“进程外”。

例如,如果只希望对生产站点进行宿主模型的进程外处理,则可以使用Web.config转换。如果您希望它在开发和生产过程中都处于进程外,只需更改我在上面调用的属性就足够了,因为它会自动转换为Web.config属性。如果您希望使用进程内模型,则在IIS应用程序中启用预加载是一个不错的选择(在此进行介绍)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在没有加号操作的情况下在GoLang中添加字符串?

如何在没有关联的UI元素的情况下在iOS中创建序列

如何在没有打字稿的情况下在Angular 2中注入Http

如何在没有x宏的情况下在C中获得类似反射的功能

在没有启动的情况下在较旧的ASP.NET MVC应用中创建HttpClient

如何在Flutter中没有Scafflod的情况下在屏幕上获取简单文本?

如何在没有管理员权限的情况下在Windows中安装DockerToolbox

如何在没有for循环的情况下在python中对数组进行采样

如何在没有页面构建器的情况下在Kentico 12中使用BizForms

如何在没有root的情况下在Android应用上访问数据库

如何在没有for循环的情况下在Matlab中获得某个输出?

Moq:如何在没有占位符接口的情况下在F#中模拟函数?

Swift:如何在没有情节提要的情况下在Container View中更新数据

如何在没有鼠标的情况下在Ubuntu GUI中访问终端

SML:如何在没有附加参数的情况下在SML中模拟计数器

如何在没有Grub Customizer的情况下在GRUB中设置默认内核?

如何在没有USB连接到Mac的情况下在iPhone中运行iOS应用

如何在没有控制台的情况下在WebSphere中重置“父优先”?

如何在没有通用用法的情况下在Swift 3.0中使用Set

如何在没有AlamoFire的情况下在Swift 3中同时发出异步HTTP请求

如何在没有函数调用的情况下在 Linux 中检索处理器时间?

如何在没有页面终止的情况下在 PHP 中设置标头 HTTP 代码?

如何在没有元素名称的情况下在 xpath 中显示文本

如何在没有任何依赖库的情况下在 Visual Studio 中构建 dll?

如何在没有 If/Else 或 Try/Catch 的情况下在 C#/MVC 中传播空实例?

如何在没有外部库的情况下在 React 中播放 <video></video>?

如何在没有手动密码提示的情况下在centos中添加用户

如何在没有滚动条的情况下在 Tailwind 中创建可滚动元素

如何在没有系统或 bash 的情况下在 execv 中使用通配符(在 c 中)?