ASP.NET Core如何实现简单的静态网站滚动更新
Intro
最近我们老板想让我实现一个静态网站“滚动更新”的功能,其实就是希望网站部署的时候网站内容完整的切换,不能网站部署的过程中一部分是新的内容,另外一部分是老的内容。
这让我想到了微软的 Azure App Service,上家公司主要是用微软的云服务 Azure,站点是部署到 Azure App Service 上的,Azure App Service 有一个部署槽的概念,我们的应用一个版本可以对应一个部署槽,通过部署槽我们就基本可以无缝地从一个版本切换到另外一个版本。
FileProvider
ASP.NET Core 里静态文件的托管是允许自定义一个 IFileProvider 的,默认会使用物理路径文件, ASP.NET Core 默认使用 wwroot 目录下作为默认的静态文件来源。
对于静态文件而言我们简单地使用两个目录来模拟两个部署槽,当需要的时候通过修改配置来动态修改生效的部署槽,基于 IOptionMonitor 和 PhysicalFileProvider 来实现一个简单的 DynamicFileProvider,实现代码如下:
public class DynamicFileProviderOptions { public string CurrentSlot { get; set; } } public class DynamicFileProvider : IFileProvider { private PhysicalFileProvider _physicalFileProvider; private const string DefaultSlotName = "Slot1"; public DynamicFileProvider(IOptionsMonitor<DynamicFileProviderOptions> optionsMonitor, IWebHostEnvironment webHostEnvironment) { var webRoot = webHostEnvironment.ContentRootPath; _physicalFileProvider = new PhysicalFileProvider(Path.Combine(webRoot, optionsMonitor.CurrentValue.CurrentSlot ?? DefaultSlotName)); optionsMonitor.OnChange(options => { var path = Path.Combine(webRoot, options.CurrentSlot); _physicalFileProvider = new PhysicalFileProvider(path); }); } public IDirectoryContents GetDirectoryContents(string subpath) { return _physicalFileProvider.GetDirectoryContents(subpath); } public IFileInfo GetFileInfo(string subpath) { return _physicalFileProvider.GetFileInfo(subpath); } public IChangeToken Watch(string filter) { return _physicalFileProvider.Watch(filter); } }
看起来是不是简单,其实就是在 PhysicalFileProvider 的基础上封装了一下,配置发生变化的时候构建一个新的 PhysicalFileProvider
Construct Host
接着我们来看一下如何使用,使用代码如下:
var builder = Host.CreateDefaultBuilder(args); builder.ConfigureWebHostDefaults(webHostBuilder => { webHostBuilder.ConfigureServices((context, services) => { services.Configure<DynamicFileProviderOptions>(context.Configuration); services.AddSingleton<DynamicFileProvider>(); }); webHostBuilder.Configure(app => { var dynamicFileProvider = app.ApplicationServices.GetRequiredService<DynamicFileProvider>(); app.UseStaticFiles(new StaticFileOptions() { FileProvider = dynamicFileProvider, }); }); }); var host = builder.Build(); host.Run();
这里的示例只需要这些代码我们的应用就可以跑起来了,接着我们就来看一下使用效果吧
Demo
在项目根目录运行 dotnet run 启动项目,然后访问 http://localhost:5000/index.html
然后我们再修改配置文件中的配置,把配置文件中 CurrentSlot 配置修改为 Slot2,然后再刷新页面,如下图所示:
那么是不是可以不修改配置文件实现部署槽切换呢,也是可以的,我提供了一个做切换的一个简单的 API
app.Map(new PathString("/redeploy"), appBuilder => appBuilder.Run(context => { if (context.RequestServices.GetRequiredService<IConfiguration>() is ConfigurationRoot configuration) { var currentSlot = configuration["CurrentSlot"]; configuration["CurrentSlot"] = "Slot2" != currentSlot ? "Slot2" : "Slot1"; configuration.Reload(); return context.Response.WriteAsync("Success"); } return Task.CompletedTask; }));
这个 API 做的事情很简单,在 Slot1 和 Slot2 之间进行切换,如果原来是 Slot2 则切换成 Slot1 否则切换成 Slot2,修改配置之后调用一下 Reload 以触发配置更新,删除配置文件中的 CurrentSlot 配置,重新运行示例,查看 http://localhost:5000/index.html,还是看到的 Slot1 中的内容,然后我们调用一下 /redeploy 接口来动态切换一下配置,然后再次刷新页面就会看到 Slot2 中的内容,再调用一下 redeploy 之后刷新页面就会变回 Slot1 中的内容
More
这样一个简单的 DynamicFileProvider 的功能就完成了,我们就可以动态的切换静态资源的不同版本了。
如果实际使用的话可以考虑更新一下 redeploy 接口,把新的网站内容通过上传文件的形式上传到网站下,上传结束后触发配置的更新,而且可以保留最近几个版本的更新,这样部署历史也有了,也方便进行回滚。
可以思考一下,如果我们的站点是集群部署的,需要改造什么?
对于集群部署的场景,可能会有两个问题,一个是文件访问的问题, 我们可以使用一个自定义的文件提供者来访问文件服务器上的文件,如果使用容器部署的场景,那么我们使用同一个 Volume 就可以实现统一的文件访问, 另一个问题是配置的管理和更新,对于集群部署的配置,通常我们需要使用配置中心来统一管理配置,这样就和上面的配置一样了,配置更新时也会触发更新。
总结
到此这篇关于ASP.NET Core如何实现简单的静态网站滚动更新的文章就介绍到这了,更多相关ASP.NET Core静态网站滚动更新内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!
References
- https://docs.microsoft.com/en-us/aspnet/core/fundamentals/static-files
- https://docs.microsoft.com/zh-cn/azure/app-service/deploy-best-practices
- https://github.com/WeihanLi/SamplesInPractice/tree/master/DynamicStaticFileProvider
相关文章
- 这篇文章主要为大家详细介绍了ASP.NET购物车的实现过程,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-22
- 在开发过程中,使用Visual Studio的断点调试功能可以很方便帮我们调试发现程序存在的错误,同样Visual Studio也支持对SQL Server里面的存储过程进行调试,下面就让我们看看具体的调试方法。...2021-09-22
- 这篇文章主要介绍了如何使用JavaScript实现“无缝滚动 自动播放”轮播图效果,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-08-20
ASP.NET Core根据环境变量支持多个 appsettings.json配置文件
这篇文章主要介绍了ASP.NET Core根据环境变量支持多个 appsettings.json配置文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22- 这篇文章主要介绍了记一次EFCore类型转换错误及解决方案,帮助大家更好的理解和学习使用asp.net core,感兴趣的朋友可以了解下...2021-09-22
- 这篇文章主要介绍了js实现文字垂直滚动和鼠标悬停效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2016-01-05
- 这篇文章主要为大家详细介绍了使用jQuery.Pin垂直滚动时固定导航的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2017-05-27
基于python计算滚动方差(标准差)talib和pd.rolling函数差异详解
这篇文章主要介绍了基于python计算滚动方差(标准差)talib和pd.rolling函数差异详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-06-08- 下面小编就为大家带来一篇JS实现图片的不间断连续滚动的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2016-06-12
详解ASP.NET Core 中基于工厂的中间件激活的实现方法
这篇文章主要介绍了ASP.NET Core 中基于工厂的中间件激活的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-22- 本文实例讲述了JS实现的N多简单无缝滚动代码。分享给大家供大家参考,具体如下:实现原理很简单,注册事件之后,立即将元素的innerHTML累加一次。接着滚动开始,当滚动条到达元素的中间位置时:不要在子元素上设置margin和paddin...2015-11-08
- 这篇文章主要为大家详细介绍了javascript实现平滑无缝滚动的具体代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2016-05-09
Mybatis Plus 字段为空值时执行更新方法未更新解决方案
这篇文章主要介绍了Mybatis Plus 字段为空值时执行更新方法未更新解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-09-03vivo OriginOS新系统如何更新 originos系统更新方法
vivo新系统更新的步骤是什么?如何更新到vivo的最新系统?vivo的最新系统太亮眼了,不少vivo的用户都在跃跃欲试想体验一下最新的系统。vivo新系统虽然做出来了不过我们想体验的话还是要等待一段时间。到时大家通过下面的方法就可以使用到新系统了...2020-12-08asp.net通过消息队列处理高并发请求(以抢小米手机为例)
这篇文章主要介绍了asp.net通过消息队列处理高并发请求(以抢小米手机为例),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22- 下面小编就为大家带来一篇JS平滑无缝滚动效果的实现代码。小编觉得挺不错的,现在分享给大家,也给大家做个参考...2016-05-09
- 这篇文章主要介绍了jQuery实现模仿微博下拉滚动条加载数据效果,涉及jQuery响应下拉滚动事件动态操作页面元素的技巧,需要的朋友可以参考下...2015-12-27
ASP.NET单选按钮控件RadioButton常用属性和方法介绍
RadioButton又称单选按钮,其在工具箱中的图标为 ,单选按钮通常成组出现,用于提供两个或多个互斥选项,即在一组单选钮中只能选择一个...2021-09-22ASP.NET 2.0中的数据操作:使用两个DropDownList过滤的主/从报表
在前面的指南中我们研究了如何显示一个简单的主/从报表, 该报表使用DropDownList和GridView控件, DropDownList填充类别,GridView显示选定类别的产品. 这类报表用于显示具有...2016-05-19- 这篇文章主要介绍了利用原生js实现类似fullpage的全屏滚动的实现方法,文中给出了完整的实例代码,相信对大家的理解和学习具有一定的参考价值,需要的朋友们可以参考借鉴,下面来一起看看吧。...2017-01-26