Kentico Xperience 탐색: 에서 Xperience를 사용합니다.NET Core Worker 서비스
In this post we'll be exploring how to integrate Kentico Xperience 13 with a .NET Core Worker Service to tail log the Xperience Event Log to a console window 💻.
여정 시작: 체험+ASP.순핵심
Kentico Xperience은 ASP와의 양호한 통합을 제공합니다.순수한 핵심.
Kentico.Xperience.AspNetCore.WebApp NuGet 패키지는 이러한 통합 포인트를 제공합니다.
우리는 ASP에서 Xperience의 모든 서비스를 등록할 수 있습니다.NET Core dependency injection 컨테이너,
services.AddKentico();
으로 문의하십시오.public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddKentico();
// ... Other DI registration
}
// ...
}
우리는 app.UseKentico(...)
을 호출하여 Xperience의 페이지 생성기 기능을 사용하고 endpoints.Kentico().MapRoutes();
을 호출하여 endpoint routing 중간부품 통합을 통해 경로를 관리할 수 있습니다.public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
// ...
}
public void Configure(
IApplicationBuilder app,
IWebHostEnvironment env)
{
// ... earlier middleware
app.UseKentico(features =>
{
features.UsePreview();
features.UsePageBuilder();
});
// ... more middleware
app.UseEndpoints(endpoints =>
{
endpoints.Kentico().MapRoutes();
});
}
}
하지만 만약 우리가 위에서 Xperience를 사용하고 싶다면.이 모든 설정이 없는 NET Core🤔? 만약 우리가 전체 ASP를 설정하고 실행하지 않는 상황에서 그것을 사용하고 싶다면?NET 핵심 웹 애플리케이션😕?다행히도 우리는 이렇게 제한이 없다. 우리는 심지어 .NET Core console application에서 Xperience의 API를 사용할 수 있다😮.
ASP에도 불구하고 Console 응용 프로그램을 사용하는 것은 잘못이 없습니다.NET 핵심 웹 응용 프로그램.
만약 우리가
appsettings.json
에서 정의한 값을 사용하고 싶다면 어떻게 해야 합니까?만약 우리가 로그 기록이나 주입에 의존해야 한다면?어플리케이션 수명주기 관리우리 어떻게 했지?아마도 우리는 여전히 ASP처럼 연속적으로 실행되는 응용 프로그램을 원할 것이다.NET 핵심 응용 프로그램, 그러나 모든 웹 기능이 없습니다.
A.NET Core Worker Service은 이 유쾌한 중간 지대에 위치하고 우리가 좋아하는 ASP 인프라를 제공합니다.NET 커널, 웹 응용 프로그램 프레임워크 블록 필요 없음👍.
우리의 첫 번째 정거장: 새로운 것을 창조하다.네트워크 핵심 업무 서비스
Visual Studio는 새 프로젝트 대화 상자에서 보조 서비스를 만들 수 있는 템플릿을 제공합니다.
이 템플릿은 입문에 필요한 기초를 제공할 것입니다.
새 프로젝트를 만들면 해결 방안 자원 관리자에서 작은 파일 목록을 볼 수 있습니다.
그 중 대부분은 ASP와 매우 비슷해 보인다.NET 핵심 항목, 파일이 훨씬 적습니다.누락된 파일의 키는
Startup.cs
입니다. 반대로 Worker.cs
파일이 있지만 지정한 설정에 appsettings.json
이 있습니다.💪🏾!Program.cs
을 열면 Main()
방법이 ASP와 비슷해 보이는 것을 알 수 있습니다.NET Core 애플리케이션:public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
// ...
}
ASP 간의 차이.NET 핵심 어플리케이션 및 보조 서비스 어플리케이션은 호스트 구성에 있습니다.ASP는NET Core는 .ConfigureWebHostDefaults(...)
을 사용합니다. 여기서 우리는 .ConfigureServices(...)
을 호출하여 의존 주입을 설정합니다. 이것은 보통 Startup.cs
에서 찾을 수 있습니다.public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<Worker>();
});
이것은 우리의 Program.cs
이 응용 프로그램을 설정하고 시작하는 데 필요한 모든 것을 포함한다는 것을 의미한다😎.그렇다면 우리 응용 프로그램에서 의미 있는 작업을 실제로 수행하는 코드는 어디에 있습니까?이것들은 모두
Worker.cs
파일에 있습니다!심층 발굴: 일꾼
Worker.cs
을 열면 BackgroundService
에서 계승된 클래스를 볼 수 있습니다.public class Worker : BackgroundService
{
private readonly ILogger<Worker> _logger;
public Worker(ILogger<Worker> logger)
{
_logger = logger;
}
// ..
}
Worker
클래스 BackgroundService
기본 클래스 ExecuteAsync(CancellationToken stoppingToken)
을 다시 쓰는 1 가지 방법:protected override async Task ExecuteAsync(
CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
_logger.LogInformation(
"Worker running at: {time}",
DateTimeOffset.Now);
await Task.Delay(1000, stoppingToken);
}
}
이 방법은 while (...)
순환을 포함할 필요는 없지만, 일반적으로 그것을 어떻게 실현하는지 볼 수 있습니다.노동자는 서비스일 뿐이기 때문에, 그들의 처리는 그들의 데이터로 미루어 시작하는 것이 아니라, 이것은 ASP와 다르다.HTTP 요청을 보낼 때 처리를 시작하는 NET 핵심 응용 프로그램입니다.
반대로 작업자는 다른 출처에서 데이터를 추출하여 데이터를 찾고 해당 데이터와 관련된 일부 조건을 충족시킬 때만 처리를 실행한다🧐.
작업자는 데이터가 언제 사용할 수 있는지 모르기 때문에, 서비스가 중단될 때까지 순환 중에 실행됩니다.
여정 계속: Kentico 경험 통합
Worker 서비스 응용 프로그램의 구성 부분을 조사한 이상 Kentico Xperience를 통합합시다!
NuGet 종속성
Kentico.Xperience.Libraries NuGet package을
.csproj
파일에 추가해야 Worker 서비스의 모든 Xperence API에 액세스할 수 있습니다.<ItemGroup>
<!-- ... other packages -->
<!-- Xperience 13 is still in beta at the time
of this blog post -->
<PackageReference
Include="Kentico.Xperience.Libraries"
Version="13.0.0-b7472.17674" />
</ItemGroup>
프로비저닝
또한 연결 문자열을 사용하여 데이터베이스 정보를
appsettings.json
의 응용 프로그램 구성에 추가해야 합니다.{
"Logging": {
// ...
},
"ConnectionStrings": {
"CMSConnectionString": "..."
},
}
응용 프로그램은 이 json
파일에서 설정을 읽도록 설정되어 있지만, Xperience는 알지 못하기 때문에 필요한 설정을 찾을 수 있도록 알려 주어야 합니다.우리는
Program.cs
을 열고 .ConfigureServices()
의 통화에 회선을 추가합니다.Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<Worker>();
Service.Use<IConfiguration>(
() => hostContext.Configuration);
});
이 Service.Use()
에 대한 호출은 Xperience의 내부 기초 구조 (주입 용기에 의존) 에서 중요한 설정을 찾을 수 있는지 알려줍니다. 예를 들어 우리가 정의한 연결 문자열😲.하나.NET Core hosted service,
hostContext.Configuration
은 표준 구성 소스의 모든 구성을 포함합니다.예를 들어,
hostContext.Configuration.GetConnectionString("CMSConnectionString");
은 appsettings.json
연결 문자열을 반환합니다.현재, 우리는 이미 간의 설정 격차를 메웠다.NET 핵심과 경험, Worker로 이동👍🏽!
초기화
그냥NET 핵심 응용 프로그램이 시작되고 실행된다고 해서 Xperience 내부가 시작되고 실행되는 것은 아닙니다.
Xperience를 명시적으로 초기화해야 합니다.다행히도, 이것은 우리가
BackgroundService
에서 제공한 또 다른 방법 중 하나를 통해 실행할 수 있으며, 우리는 Worker
클래스에서 이 방법을 다시 쓸 수 있다.public override Task StartAsync(CancellationToken cancellationToken)
{
CMSApplication.Init();
return base.StartAsync(cancellationToken);
}
프로그램이 시작되고 is ready to execute the Worker이 완료되면 StartAsync
은 한 번만 실행됩니다.이것은 호출
CMSApplication.Init();
을 통해 Xperience를 초기화하는 가장 좋은 위치입니다.😃.현재, 우리는 이미 설정하고 초기화했으며, 우리는 약간의 일을 하려고 한다.
우리의 목적은 Xperience 이벤트 로그에 꼬리 기록기를 만드는 것이다
이 글의 시작에서, 나는 Xperience 이벤트 로그를 위해 꼬리 기록기를 구축할 것이라고 말했다.기본적인 Xperience+Worker 서버 통합을 구축했으니 이제 시작할 수 있습니다.
콘솔 로깅 추가
우선 콘솔 로그 및 disable the default application startup logs을 포함하여
Program.cs
의 호스트 구성을 업데이트해야 합니다.Host.CreateDefaultBuilder(args)
.ConfigureLogging(logging =>
{
// Adds console output for logs
logging.AddConsole();
})
.ConfigureServices((hostContext, services) =>
{
// Disables the startup logs
services.Configure<ConsoleLifetimeOptions>(opts =>
opts.SuppressStatusMessages = true);
services.AddHostedService<Worker>();
Service.Use<IConfiguration>(
() => hostContext.Configuration);
});
이제 Worker.cs
으로 돌아가 로그 꼬리를 인코딩할 수 있습니다.우리 일꾼 갱신
우리는
Worker
클래스의 맨 위에 두 개의 개인 구성원을 정의할 것이다.private int latestLogId = 0;
private delegate void LogAction(string s, params object[] args);
latestLogId
콘솔에서 로그아웃한 최신 EventLogInfo
을 추적하므로 출력에 중복 메시지를 보내지 않습니다.😉.LogAction
은 로그 코드를 나중에 더 깨끗하게 만드는 데 사용되는 명명 함수 서명입니다. 이것은 우리가 사용하고 싶은 모든 ILogger
방법과 일치합니다.다음은
ExecuteAsync
을 업데이트합니다.protected override async Task ExecuteAsync(
CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
var eventLog = (await EventLogProvider
.GetEvents()
.OrderByDescending(
nameof(EventLogInfo.EventID))
.TopN(1)
.GetEnumerableTypedResultAsync(
cancellationToken: stoppingToken))
.FirstOrDefault();
LogEvent(eventLog);
await Task.Delay(5000, stoppingToken);
}
}
위에서 우리는 Xperience 13에서 최신 async
조회를 사용했다🔥🔥🔥 데이터베이스(존재하는 경우)에서 5초마다 최신 EventLogInfo
을 가져옵니다.If you want to learn more about the new data access APIs in Kentico Xperience 13, check out my post Kentico Xperience 13 Beta 3 - New Data Access APIs.
Kentico Xperience 13 Beta 3 - 새로운 데이터 액세스 API
숀 G 라이트・ 20년 8월 4일・ 8분 읽기
LogEvent()
통화로 들어가서 거기서 무슨 일이 일어났는지 봅시다.private void LogEvent(EventLogInfo eventLog)
{
if (eventLog is null ||
eventLog.EventID == latestLogId)
{
return;
}
var action = GetAction(eventLog.EventType);
action("Xperience Event {id} {type} {time} {source} {code} {description}",
eventLog.EventID,
eventLog.EventType,
eventLog.EventTime,
eventLog.Source,
eventLog.EventCode,
eventLog.EventDescription
);
latestLogId = eventLog.EventID;
}
우선, 우리는 eventLog
이 null
이 아니라는 것을 확보한다.🤷🏽♀️) 검색이 되돌아오는 로그 기록은 우리가 방금 표시한 기록이 아니다.그리고 우리는
GetAction()
을 호출하여 데이터베이스에서 찾은 로그 유형에 따라 정확한 ILogger
방법을 선택합니다.호출할 작업 (
ILogger
방법) 의 인용이 있으면, 모든 eventLog
데이터와 로그 메시지 템플릿으로 호출합니다.마지막으로, 우리는
latestLogId
의 id로 eventLog
을 업데이트합니다. 그러면 우리는 다음 순환에서 자신을 반복하지 않습니다.코드의 마지막 자리는
GetAction()
방법입니다. 이 방법은 C# 8 switch expression을 사용합니다.🤓 올바른 ILogger
방법을 선택하려면:private LogAction GetAction(string eventLogType) =>
eventLogType switch
{
"W" => logger.LogWarning,
"E" => logger.LogError,
"I" => logger.LogInformation,
_ => logger.LogInformation
};
Xperience EventLogInfo
기록은 "W"
, "E"
과 "I"
을 사용하여 로그의 유형을 표시합니다. 어떤 이유로 일치하지 않으면 ILogger.Information
방법을 기본적으로 사용합니다.체험 이벤트 로그 추적!
우리는 마침내 완성했다. 이제 우리가 이미 무엇을 완성했는지 볼 수 있다.
1MB 애니메이션 GIF, 콘솔의 체험 이벤트 로그 뒤따르기 표시
위의 기록에서 이벤트 로그를 만드는 Xperience 콘텐츠 관리 프로그램에서 어떤 작업을 수행할 때마다 정보가 아래 컨트롤러 창에 표시됩니다.
또한 웹 사이트를 방문하려고 시도했을 때
throw new System.Exception("Kaboom 💣 💥 🔥 🧨");
콘텐츠 교부 응용 프로그램에 HomeController
을 편리하게 놓아 컨트롤러에 오류 메시지(창고 추적)를 표시했습니다.내 시크한 표정이 너무 나빠😏 don't display in the console !)
결론
비록 이 시범은 매우 재미있지만, 우리 모두가 우리의 생산 환경에 배치할 수 있는 것도 아니다!
가장 중요한 것은 Kentico Xperence 지원 통합입니다.NET 핵심 작업자 서비스, 이것은 현재 다른 강력한 도구라는 것을 의미하며, 우리는 우리의 소프트웨어 개발 도구 테이프에 추가할 수 있다💪🏿.
본고에서 우리가 보지 못한 것은 운행 노동자 서비스 inside an ASP.NET Core application이다.이것은 Xperience 콘텐츠 관리 응용 프로그램에서 작업을 스케줄링하는 것과 같은 백엔드 라인으로 작업을 옮길 수 있습니다. 다른 점은 완전히
async
일 수 있다는 것입니다.We could even use channels which are powerful abstractions of the classic publish/subscribe pattern 🧐.
나 흥분했어.😄 Kentico Xperience 커뮤니티가 노동자 서비스와 같은 신기술을 사용하는 데 발견한 모든 창조적인 방식에 대해 이 글을 읽고 당신도 그러길 바랍니다.
당신은 경험이 있는 노동자 서비스를 어떻게 사용하는지에 대해 어떤 생각을 가지고 있습니까?다음 댓글로 아이디어를 공유합니다!
...
변함없이 읽어주셔서 감사합니다.🙏!
사진은 Jordan Madrid 에서 Unsplash으로 촬영되었다
우리는 Kentico's GitHub account개의 개발자 자원 목록을 열거했다.가봐!
다른 Kentico 컨텐츠를 찾고 있는 경우 DEV에서 여기에 Kentico 태그를 체크 아웃합니다.
.ltag\uu tag\uu id\uu 5339.작업 버튼 따르기
배경색:!중요했어
색상:!중요했어
테두리 색상:!중요했어
}
# 켄티코
또는 내, 예를 들면:
Reference
이 문제에 관하여(Kentico Xperience 탐색: 에서 Xperience를 사용합니다.NET Core Worker 서비스), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/seangwright/kentico-xperience-xplorations-using-xperience-in-a-net-core-worker-service-4o2d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)