如何在backgroundservice获取asp.netcore启动地址(代码片段)

dotNET跨平台 dotNET跨平台     2022-11-30     683

关键词:

前言

上次,我们介绍了《如何获取 ASP.NET Core 启动地址》。

但是,如果要在 BackgroundService 中获取启动地址可不那么容易,因为 BackgroundService 在 app 启动前就开始执行了:

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHostedService<DemoBackgroundService>();

var app = builder.Build();

app.MapGet("/", () => "Hello My IO!");

await app.StartAsync();

Console.WriteLine(app.Urls.First());

await app.WaitForShutdownAsync();

internal class DemoBackgroundService : BackgroundService

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    
        Console.WriteLine("BackgroundService ExecuteAsync");
        await Task.CompletedTask;
    

那要怎么实现呢?

IHostApplicationLifetime

我们可以利用ASP.NET Core应用程序生存期事件,等待启动完成再获取启动地址:

internal class DemoBackgroundService : BackgroundService

    private readonly IServiceProvider _services;
    private string _url;

    public DemoBackgroundService(IServiceProvider services, IHostApplicationLifetime lifetime)
    
        _services = services;
        lifetime.ApplicationStarted.Register(OnAppStarted);
    
    public void OnAppStarted()
    
        var server = _services.GetService<IServer>();
        _url = server.Features.Get<IServerAddressesFeature>().Addresses.First();
    
    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    
        while (string.IsNullOrWhiteSpace(_url))
        
            await Task.Delay(1000); 
        
        
        Console.WriteLine("BackgroundService ExecuteAsync");
        Console.WriteLine(_url);

        await Task.CompletedTask;
    

现在可以正常获取 ASP.NET Core 启动地址了:

SemaphoreSlim

轮询虽然可以解决问题,但感觉不太优雅。

我们可以创建一个信号灯 SemaphoreSlim,在ExecuteAsync方法中等待信号灯,而在启动后释放信号灯:

static SemaphoreSlim semaphoreSlim = new SemaphoreSlim(0, 1);

public void OnAppStarted()

    ...
    semaphoreSlim.Release();

protected override async Task ExecuteAsync(CancellationToken stoppingToken)

    await semaphoreSlim.WaitAsync();
    ...

可以看到,这样还带来了另外一个好处,比上面的解决方式更快地进入到了 BackgroundService:

结论

今天,我们利用了ASP.NET Core应用程序生存期事件,实现了在 BackgroundService 获取 ASP.NET Core 启动地址。

添加微信号【MyIO666】,邀你加入技术交流群

从asp.net core 2.1中的控制器访问BackgroundService

】从asp.netcore2.1中的控制器访问BackgroundService【英文标题】:accessBackgroundServicefromcontrollerinasp.netcore2.1【发布时间】:2018-09-0704:38:06【问题描述】:我只需要从控制器访问我的BackgroundService。由于BackgroundServices被注入了services.AddSing... 查看详情

如何在 BackgroundService 类中制作 ServiceBusClient 和 ServiceBusProcessor DisposeAsync?

】如何在BackgroundService类中制作ServiceBusClient和ServiceBusProcessorDisposeAsync?【英文标题】:HowtomakeServiceBusClientandServiceBusProcessorDisposeAsyncinBackgroundServiceclass?【发布时间】:2022-01-0918:42:12【问题描述】:我有一个名为“TestService”的类... 查看详情

使用 ASP.NET Core 6 Minimal API 在 Azure 中停止 Web 应用程序时未调用 BackgroundService StopAsync

】使用ASP.NETCore6MinimalAPI在Azure中停止Web应用程序时未调用BackgroundServiceStopAsync【英文标题】:BackgroundServiceStopAsyncnotcalledwhenstoppingWebAppinAzureusingASP.NETCore6MinimalAPI【发布时间】:2022-01-2003:58:23【问题描述】:我使用VS2022ASP.NET6.0创建... 查看详情

从 BackgroundService 创建 DbContext 租户时配置它

】从BackgroundService创建DbContext租户时配置它【英文标题】:ConfigureDbContexttenantwhencreatingitfromBackgroundService【发布时间】:2021-05-0103:00:33【问题描述】:我有一个ASP.NETCore3.1应用程序,它使用现有的Postgres数据库,其中每个租户都存... 查看详情

急切加载不适用于 BackgroundService

】急切加载不适用于BackgroundService【英文标题】:Eagerloadingdoesn\'tworkwithBackgroundService【发布时间】:2022-01-0909:17:12【问题描述】:我正在尝试在运行BackgroundService的控制台应用程序中加载相关实体,但它不加载相关实体,我已经... 查看详情

如何在 ASP.NET MVC 中获取当前用户

】如何在ASP.NETMVC中获取当前用户【英文标题】:HowtogetthecurrentuserinASP.NETMVC【发布时间】:2008-11-0421:24:25【问题描述】:在表单模型中,我曾经通过以下方式获取当前登录用户:Page.CurrentUser如何在ASP.NETMVC的控制器类中获取当前... 查看详情

如何在asp.net core中获取当前用户

】如何在asp.netcore中获取当前用户【英文标题】:Howtogetcurrentuserinasp.netcore【发布时间】:2016-08-0702:00:32【问题描述】:我想获取当前用户,以便访问他们的电子邮件地址等字段。但我不能在asp.net核心中做到这一点。这是我的代... 查看详情

如何通过 Youtube API 在 asp.net 中获取用户视频列表

】如何通过YoutubeAPI在asp.net中获取用户视频列表【英文标题】:HowtogetuservideolistthroughYoutubeAPIinasp.net【发布时间】:2012-06-2308:43:30【问题描述】:如何通过YoutubeAPT在asp.net中获取播放列表提要。当我尝试获取数据时,我得到了Totalr... 查看详情

如何在 ASP.NET 中获取登录用户信息

】如何在ASP.NET中获取登录用户信息【英文标题】:HowtogetloggedinuserinformationinASP.NET【发布时间】:2019-09-1220:33:43【问题描述】:我正在处理ASP.NET项目,我试图捕获当前登录的用户信息,例如它的电子邮件地址。如果使用cookie信息... 查看详情

如何在 ASP.NET 中以 'YYYY-MM-DD' 格式获取当前日期?

】如何在ASP.NET中以\\\'YYYY-MM-DD\\\'格式获取当前日期?【英文标题】:Howtogetcurrentdatein\'YYYY-MM-DD\'formatinASP.NET?如何在ASP.NET中以\'YYYY-MM-DD\'格式获取当前日期?【发布时间】:2011-06-2902:20:06【问题描述】:如何在ASP.NET中以\'YYYY-MM-DD\... 查看详情

如何在 asp.net 控制器中获取用户身份?

】如何在asp.net控制器中获取用户身份?【英文标题】:Howtogetuseridentityinsideasp.netcontroller?【发布时间】:2021-05-0207:57:57【问题描述】:仅供参考:我已经看过这个答案,但答案无效=>HowdoIgetcurrentuserin.NETCoreWebAPI(fromJWTToken)场景... 查看详情

如何在asp.net网站中获取cookie值

】如何在asp.net网站中获取cookie值【英文标题】:Howtogetthecookievalueinasp.netwebsite【发布时间】:2012-01-1909:07:46【问题描述】:我正在创建一个cookie并在成功登录后存储用户名的值。打开网站时如何访问cookie。如果cookie存在,我想从... 查看详情

如何在 jquery 方法中获取 asp.net 会话值?

】如何在jquery方法中获取asp.net会话值?【英文标题】:Howtogetasp.netSessionvalueinjquerymethod?【发布时间】:2010-10-2518:53:48【问题描述】:我想在ASP.NETMVC视图页面的jquery方法中访问Session值。看下面的代码,$(\'input[type=text],select,input[ty... 查看详情

如何在asp.net的新闻中获取类别计数使用

】如何在asp.net的新闻中获取类别计数使用【英文标题】:HowtogetCategoryCountUseatNewsinasp.net【发布时间】:2021-10-0321:35:43【问题描述】:大家好,我在获取新闻中使用的类别计数时遇到问题例如我想知道“国际”类别在新闻中有多... 查看详情

如何在 ASP.NET Core MVC 中获取 Url Referrer?

】如何在ASP.NETCoreMVC中获取UrlReferrer?【英文标题】:HowcanIgetUrlReferrerinASP.NETCoreMVC?【发布时间】:2016-08-0416:08:21【问题描述】:我正在尝试将ASP.NETMVC网络表单迁移到ASP.NETCoreMVC。目前,我在使用Request.UrlReferrer课程时遇到了问题... 查看详情

如何在 ASP.NET 中获取客户端日期和时间?

】如何在ASP.NET中获取客户端日期和时间?【英文标题】:HowtogetclientdateandtimeinASP.NET?【发布时间】:2010-09-2110:47:00【问题描述】:当我使用DateTime.Now时,我从服务器的角度获取日期和时间。有没有办法在ASP.NET中获取client日期和... 查看详情

如何在 ASP.NET Core 中获取 HttpContext.Current? [复制]

】如何在ASP.NETCore中获取HttpContext.Current?[复制]【英文标题】:HowtogetHttpContext.CurrentinASP.NETCore?[duplicate]【发布时间】:2016-11-2823:44:31【问题描述】:我们目前正在使用ASP.NETCore重写/转换我们的ASP.NETWebForms应用程序。尽量避免重新... 查看详情

如何在 ASP.net MVC3 中获取 Advantage Database 数据?

】如何在ASP.netMVC3中获取AdvantageDatabase数据?【英文标题】:HowtogettheAdvantageDatabasedatainASP.netMVC3?【发布时间】:2012-04-0319:07:51【问题描述】:我在Asp.netMVC3环境中,我使用AdvantageDatabase9.1。我想在Asp.net中获取AdvantageDatabase数据(+Re... 查看详情