.NET 5를 사용한 게으른 일요일

5948 단어 net5c
일요일 오후였고 .NET 5의 새로운 기능 중 일부를 사용해 보고 무언가를 배우고 싶었습니다. 나는 bit.ly에 약간의 짜증을 냈습니다. 짧은 URL을 사용자 지정했을 때 돌아가서 링크를 업데이트할 수 없었습니다. 뭔가를 만들고 싶을 정도로 충분했습니다.

저도 배우고 싶은 것이 몇 가지 있었는데, 두 마리... 한 돌:
  • 처음부터 C# 프로젝트에 VS Code를 사용합니다.
  • C# 9의 최상위 문으로 재생합니다.
  • Cosmos의 Table Storage를 사용합니다.
  • MVC, Razor Pages 등을 호출하지 않고 간단한 작업을 수행합니다.

  • 가장 먼저 한 일은 명령줄에서 새 .NET Core 프로젝트를 시작하는 것이었습니다.

    > dotnet new web
    
    


    Visual Studio Code를 열면 최소한의 ASP.NET Core 프로젝트가 있다는 것을 알 수 있습니다. Startup.cs를 완전히 삭제했습니다. Program.cs를 열고 모든 것을 다시 삭제했습니다. 기본 사항부터 시작했습니다.

    Host.CreateDefaultBuilder(args)
      .ConfigureWebHostDefaults()
      .Start();
    
    


    using 문을 추가해야 했지만 이제 완전히 활성화된 프로젝트가 생겼습니다(아무것도 하지 않았지만 404를 반환함).

    using Microsoft.AspNetCore.Hosting;
    
    Host.CreateDefaultBuilder(args)
      .ConfigureWebHostDefaults()
      .Start();
    
    


    실제 작업을 처리하기 위해 LinkManager라는 간단한 클래스를 만들었습니다. 하지만 제대로 작동하려면 Startup.cs에서 일반적으로 수행하는 많은 작업을 수동으로 구성해야 했습니다(이는 사용자가 수행해야 하는 작업이 아니라 내가 수행한 작업일 뿐입니다).

    Host.CreateDefaultBuilder(args)
      .ConfigureWebHostDefaults(bldr =>
      {
    
        bldr.ConfigureServices(svc =>
        {
          svc.AddTransient<LinkManager>();
        });
    
        bldr.Configure(app =>
        {
          app.Run(async context =>
            {
              var manager = app.ApplicationServices.GetService<LinkManager>();
              await manager.HandleRedirection(context);
            });
        });
    
      })
      .Start();
    
    


    이렇게 작은 것치고는 좋았습니다. 이 시점에서 Visual Studio Code는 프로젝트를 정말 잘 수행하고 있었습니다. Visual Studio로 갈 이유가 전혀 없었지만 곧 도착할 것입니다...

    HandleRedirection 내에서 요청된 경로가 유효한 리디렉션인지 검색하고 그렇다면 리디렉션을 설정합니다.

    public async Task HandleRedirection(HttpContext ctx)
    {
      try
      {
        var redirect = await FindRedirect(ctx.Request.Path);
        if (redirect is not null)
        {
          ctx.Response.Redirect(redirect);
          return;
        }
      }
      catch (Exception ex)
      {
        _logger.LogError("Exception during finding short link", ex);
      }
    }
    
    


    실패한 링크가 404 또는 500만 반환한다는 생각이 싫었습니다. 그래서 이를 처리하기 위해 웹 페이지가 필요하다고 결정했습니다. 하지만 무엇을 해야 할까요? Razor Pages 또는 MVC(또는 다른 프레임워크)를 도입해야 합니까?

    대신 페이지를 제공하기로 결정했습니다.

    ctx.Response.ContentType = "text/html";
    var page = await File.ReadAllTextAsync(
      Path.Combine(_env.ContentRootPath, "index.html"));
    await ctx.Response.WriteAsync(page);
    
    


    한 페이지만 제공하고 있었기 때문에 괜찮았습니다. 여기에는 동적 코드가 없습니다. index.html 페이지로 리디렉션할 수 있었지만 대신 URL이 보존되도록 제공했습니다. 한 가지 메모는 내가 로컬 CSS 파일을 사용하고 있다는 것입니다. 그래서 이를 처리하기 위해 StaticFiles를 선택했습니다.

    bldr.Configure(app =>
    {
      app.UseStaticFiles();
    
      app.Run(async context =>
        {
          var manager = app.ApplicationServices.GetService<LinkManager>();
          await manager.HandleRedirection(context);
        });
    });
    
    


    쉬운 완두콩!

    마지막으로 Cosmos Table Storage를 사용하는 것입니다. 설정 방법에 대해서는 자세히 설명하지 않겠지만 코드의 핵심(설정되면)은 키를 기반으로 특정 행을 검색하는 것입니다. 테이블에는 짧은 URL과 최종 목적지만 있습니다.

    var op = TableOperation.Retrieve<LinkEntity>(PARTITIONKEY, key);
    var result = await _table.ExecuteAsync(op);
    var link = result.Result as LinkEntity;
    if (link != null)
    {
      if (linkCache is null) linkCache = new Dictionary<string, string>();
      linkCache[key] = link.Link;
      _cache.Set(LINKCACHE, linkCache, DateTimeOffset.Now.AddMinutes(60));
    
      _logger.LogInformation("Added Key to Cache");
    
      return link.Link;
    }
    
    


    Cosmos에 실제로 연결하는 방법을 확인하려면 코드를 자유롭게 살펴보세요. 매우 간단합니다.

    마지막 부분은 Azure에 배포하는 것이었습니다. 짧은 시리즈here에서 이에 대해 자세히 다루었지만 이 과정에서 흥미로운 점은 배포할 Docker 이미지를 생성해야 한다는 점이었습니다.

    방금 Dockerfile을 추가하고 손으로 코딩할 수 있었지만 게을렀습니다. 이것은 Visual Studio에서 프로젝트를 다시 여는 순간이었습니다. 그래서 놀랍도록 쉬운 "Docker 지원"을 사용하여 이미지를 만들 수 있었습니다.



    그런 다음 Azure 마법을 설정하기만 하면 작동이 시작되었습니다!

    알아두세요, 저는 게으릅니다. 따라서 Azure 도구(Azure Storage Explorer 또는 Portal)를 사용하여 항목을 수동으로 추가하여 코드에 관리 기능이 전혀 없도록 합니다. 보안 및 여러 양식을 처리해야 하므로 결국 처리해야 할 수도 있지만 지금은 게으른 접근 방식을 사용할 수 있습니다.

    여기에서 시도해 볼 수 있습니다.

    https://shawnl.ink/psauthor



    궁금하시면 코드는 다음 위치에 있습니다.

    https://github.com/shawnwildermuth/shawnlink



    그래, 아마 그 위에 새 쇼트너를 사용했어야 했어.



    Shawn Wildermuth의 이 저작물은 Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License에 따라 라이선스가 부여되었습니다.
    wildermuth.com의 작업을 기반으로 합니다.


    이 기사가 마음에 들면 Pluralsight에서 Shawn의 과정을 참조하십시오.

    좋은 웹페이지 즐겨찾기