Azure Service Bus & Azure Function Trigger & Nuget Downgrade

Azure Service Bus와 console app으로 메세지 프로세싱을 하고 있었는데 이번에 Azure Function Trigger로 변경하고 있습니다.

변경하면서 느낀 것은 Azure Function이 .NET 5를 지원하지 않는다는 것인데요.
덕분에 제가 사용하던 소스코드들도 C# 9.0 → C# 8.0으로 다 고치고…사용하던 Nuget Package도 다운그레이드를 하고 있습니다. Microsoft.Extensions.Http, Microsoft.Extensions.DependencyInjection 등등이 있는데요.

궁금한 것은 .NET 5를 종속성으로 가지지 않은 Nuget Package 들도 다운그레이드를 해야한다는 점입니다. 문제되는 패키지가 System.ComponentModel.Annotations 5.0.0 인데요… 저와 같은 문제를 만나신 분들을 구글링을 통해 만날 수 있었습니다. System.ComponentModel.Annotatoins Version=5.0.0.0 (doesn't exist) · Issue #7221 · Azure/azure-functions-host · GitHub

아무래도 아직 해결이 되지 않은 듯 합니다.
System.ComponentModel.Annotations 5.0.0 의 버전을 4.7로 낮추려고 하면 Visual Studio 2019에서 아래 이미지와 같은 에러가 발생하는데요.

여기서 직접 참조하라는 말은 DLL 형태로 패키지를 받아서 수동으로 프로젝트에 연결해주라는 말일까요?

Azure Function 사용 경험 있으신 분들의 조언을 구합니다.

자답합니다.

다른 커뮤니티에서 힌트를 주신 분이 .NET 5로 개발이 가능하다 하셔서 문서를 남깁니다.
이게 MSDN을 한글로 보던 습관이 있다보니 이런 걸 캐치를 못하네요.

이 문서에 보면 아래 그림과 같이 VS2019에서는 .NET 5 Azure Function을 개발할 수 없다고 나옵니다.

하지만 영어 문서는 다음과 같이 나와있습니다.

그리고 VS2019 16.10 버전은 출시된지 1달이 지나지 않았습니다…
저도 4월 말에 16.9버전까지 쓰고 있었는데 업데이트를 자주 안했더니 지원 프로젝트 템플릿이 적었네요.

아무튼 이 문서대로…VS2019를 16.10.3 버전으로 업데이트하니 아래 그림처럼 .NET 5가 Azure Function 프로젝트 템플릿에 출력됩니다. 격리는 무슨 뜻인지 모르겠네요.

image

.NET 5로 Azure Function을 생성하면 최초 질문에서 언급했던 Nuget 패키지들이 모두 .NET 5로 된 것들이 자동으로 참조가 되어 만들어집니다.

.NET Core 3.1로 Azure Function 개발할 때 IoC 컨테이너는 Startup 클래스를 따로 작성해서 했어야 했는데, .NET 5로 Azure Function 개발할 때는 Program 클래스가 있어서 그냥 여기에 작성하면 될 듯 합니다.

좋아요 1

.NET 5로 Azure Service Bus Trigger를 Azure Function으로 개발하다 발생했습니다.

        static async Task Main()
        {
            IHost host = new HostBuilder()
                .ConfigureFunctionsWorkerDefaults()
                .ConfigureAppConfiguration((hostingContext, configuration) =>
                {
                    //configuration.Sources.Clear();

                    IHostEnvironment env = hostingContext.HostingEnvironment;
                    configuration.SetBasePath(hostingContext.HostingEnvironment.ContentRootPath);
                    configuration.AddJsonFile("local.settings.json", optional: true, reloadOnChange: true);

                    IConfigurationRoot configurationRoot = configuration.Build();
                    ShopeeSecretKeySettings shopeeSecretKeySettings = new();
                    configurationRoot.GetSection(nameof(ShopeeSecretKeySettings)).Bind(shopeeSecretKeySettings);
                })
                .ConfigureServices((context, services) =>
                {
                    services.Configure<ShopeeSecretKeySettings>(context.Configuration.GetSection(nameof(ShopeeSecretKeySettings)));

                    services.AddHttpClient();
                    services.AddHttpClient("RequestLimitHttpClient").ConfigurePrimaryHttpMessageHandler(() =>
                    {
                        return new HttpClientHandler
                        {
                            MaxConnectionsPerServer = MaxConnection,
                        };
                    });
                })
                .Build();

            await host.RunAsync();
        }

위 소스에서 주석처리한 configuration.Sources.Clear() 를 사용하면 local.settings.json에 작성한 연결 문자열을 인식하지 못합니다.