91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

ASP.NET中怎么實現靜態網站滾動更新

發布時間:2021-07-06 17:52:02 來源:億速云 閱讀:184 作者:Leah 欄目:開發技術

這期內容當中小編將會給大家帶來有關ASP.NET中怎么實現靜態網站滾動更新,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

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

ASP.NET中怎么實現靜態網站滾動更新

然后我們再修改配置文件中的配置,把配置文件中 CurrentSlot 配置修改為 Slot2,然后再刷新頁面,如下圖所示:

ASP.NET中怎么實現靜態網站滾動更新

那么是不是可以不修改配置文件實現部署槽切換呢,也是可以的,我提供了一個做切換的一個簡單的 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 中的內容

ASP.NET中怎么實現靜態網站滾動更新

上述就是小編為大家分享的ASP.NET中怎么實現靜態網站滾動更新了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

柳林县| 进贤县| 枣庄市| 禄劝| 巴里| 仁怀市| 嘉黎县| 南城县| 海门市| 鄂托克前旗| 兴仁县| 洪泽县| 孝昌县| 乌鲁木齐县| 潢川县| 吉隆县| 娱乐| 六安市| 比如县| 承德市| 左权县| 吉安县| 荃湾区| 拉孜县| 广元市| 利川市| 唐河县| 磐安县| 依安县| 大名县| 武定县| 嵩明县| 开封县| 宁武县| 尖扎县| 万宁市| 庆云县| 西贡区| 海阳市| 陇西县| 安徽省|