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

그 다음 에 설정 파일 의 설정 을 수정 하고 설정 파일 의 Current Slot 설정 을 Slot 2 로 수정 한 다음 에 페이지 를 새로 고 칩 니 다.다음 그림 과 같 습 니 다.

그러면 설정 파일 을 수정 하지 않 고 배치 슬롯 전환 을 할 수 있 습 니까?또한 가능 합 니 다.저 는 전환 을 하 는 간단 한 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 는 매우 간단 합 니 다.슬롯 1 과 슬롯 2 사 이 를 전환 합 니 다.슬롯 2 였 다 면 슬롯 1 로 전환 하지 않 았 다 면 슬롯 2 로 전환 합 니 다.설정 을 수정 한 후에 Reload 를 호출 하여 설정 업 데 이 트 를 촉발 합 니 다.설정 파일 에 있 는 Current Slot 설정 을 삭제 하고 예 시 를 다시 실행 합 니 다.http://localhost:5000/index.html보 이 는 슬롯 1 의 내용 인지,그 다음 에/redeploy 인 터 페 이 스 를 호출 하여 설정 을 동적 으로 전환 한 다음 에 페이지 를 다시 새로 고침 하면 Slot 2 의 내용 을 볼 수 있 습 니 다.다시 redeploy 를 호출 한 후에 페이지 를 새로 고침 하면 Slot 1 의 내용 으로 돌아 갑 니 다.

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
  • 좋은 웹페이지 즐겨찾기