关键词:
前言
上次,我们介绍了《如何获取 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... 查看详情