Codemaru 1.0.0.0
QR 코드, 모바일 랜딩 페이지, vCard 연락처 저장과 명함 디자인을 한 화면에서 제공하는 디지털 명함 서비스입니다.
로딩중...
검색중...
일치하는것 없음
Codemaru.Services.SitePreviewService 클래스 참조sealed

더 자세히 ...

Codemaru.Services.SitePreviewService에 대한 상속 다이어그램 :
Codemaru.Services.SitePreviewService에 대한 협력 다이어그램:

Public 멤버 함수

 SitePreviewService (ILogger< SitePreviewService > logger, IConfiguration config)
override void Dispose ()

Protected 멤버 함수

override async Task ExecuteAsync (CancellationToken stoppingToken)

Private 멤버 함수

async Task FetchAllAsync (CancellationToken ct)
async Task FetchOneAsync (string key, string siteUrl, string outputDir, CancellationToken ct)

정적 Private 멤버 함수

static readonly (string Key, string Url)[] Sites

Private 속성

readonly string _wwwRoot
readonly ILogger< SitePreviewService_logger
readonly TimeSpan _interval
readonly HttpClient _http

정적 Private 속성

static readonly Regex OgImageRegex
static readonly Regex OgImageRegex2

상세한 설명

외부 사이트의 og:image를 주기적으로 가져와 wwwroot/img/previews/ 에 캐시합니다.

SitePreviewService.cs 파일의 18 번째 라인에서 정의되었습니다.

생성자 & 소멸자 문서화

◆ SitePreviewService()

Codemaru.Services.SitePreviewService.SitePreviewService ( ILogger< SitePreviewService > logger,
IConfiguration config )
inline

지정한 설정으로 SitePreviewService 클래스의 새 인스턴스를 초기화합니다.

매개변수
loggerlogger에 사용할 ILogger<SitePreviewService> 값입니다.
configconfig에 사용할 IConfiguration 값입니다.

SitePreviewService.cs 파일의 124 번째 라인에서 정의되었습니다.

125 {
126 _logger = logger;
127 _interval = TimeSpan.FromHours(config.GetValue("SitePreview:RefreshHours", 6));
128 _wwwRoot = Path.Combine(AppContext.BaseDirectory, "wwwroot");
129 _http = new HttpClient(new HttpClientHandler { AllowAutoRedirect = true });
130 _http.DefaultRequestHeaders.UserAgent.ParseAdd(
131 "Mozilla/5.0 (compatible; CodemaruBot/1.0; +https://codemaru.co.kr)");
132 _http.Timeout = TimeSpan.FromSeconds(15);
133 }

다음을 참조함 : _http, _interval, _logger, _wwwRoot.

멤버 함수 문서화

◆ Dispose()

override void Codemaru.Services.SitePreviewService.Dispose ( )
inline

이 인스턴스가 소유한 리소스를 해제합니다.

SitePreviewService.cs 파일의 304 번째 라인에서 정의되었습니다.

305 {
306 _http.Dispose();
307 base.Dispose();
308 }

다음을 참조함 : _http.

◆ ExecuteAsync()

override async Task Codemaru.Services.SitePreviewService.ExecuteAsync ( CancellationToken stoppingToken)
inlineprotected

Execute Async 작업을 수행합니다.

매개변수
stoppingTokenstopping Token에 사용할 CancellationToken 값입니다.
반환값
Execute Async 작업에서 생성한 Task 결과입니다.

SitePreviewService.cs 파일의 159 번째 라인에서 정의되었습니다.

160 {
161 while (!stoppingToken.IsCancellationRequested)
162 {
163 await FetchAllAsync(stoppingToken);
164
165 try { await Task.Delay(_interval, stoppingToken); }
166 catch (OperationCanceledException) { break; }
167 }
168 }

다음을 참조함 : _interval, FetchAllAsync().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ FetchAllAsync()

async Task Codemaru.Services.SitePreviewService.FetchAllAsync ( CancellationToken ct)
inlineprivate

Fetch All Async 작업을 수행합니다.

매개변수
ct취소 요청을 감시하는 토큰입니다.
반환값
Fetch All Async 작업에서 생성한 Task 결과입니다.

SitePreviewService.cs 파일의 194 번째 라인에서 정의되었습니다.

195 {
196 var outputDir = Path.Combine(_wwwRoot, "img", "previews");
197 Directory.CreateDirectory(outputDir);
198
199 foreach (var (key, url) in Sites)
200 {
201 if (ct.IsCancellationRequested) break;
202 await FetchOneAsync(key, url, outputDir, ct);
203 }
204 }

다음을 참조함 : _wwwRoot, FetchOneAsync().

다음에 의해서 참조됨 : ExecuteAsync().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ FetchOneAsync()

async Task Codemaru.Services.SitePreviewService.FetchOneAsync ( string key,
string siteUrl,
string outputDir,
CancellationToken ct )
inlineprivate

Fetch One Async 작업을 수행합니다.

매개변수
keykey에 사용할 string 값입니다.
siteUrlsite Url에 사용할 string 값입니다.
outputDiroutput Dir에 사용할 string 값입니다.
ct취소 요청을 감시하는 토큰입니다.
반환값
Fetch One Async 작업에서 생성한 Task 결과입니다.

SitePreviewService.cs 파일의 254 번째 라인에서 정의되었습니다.

255 {
256 var destPath = Path.Combine(outputDir, $"{key}.jpg");
257 var tempPath = destPath + ".tmp";
258
259 try
260 {
261 // 1. 사이트 HTML 가져오기
262 var html = await _http.GetStringAsync(siteUrl, ct);
263
264 // 2. og:image URL 파싱
265 var match = OgImageRegex.Match(html);
266 if (!match.Success) match = OgImageRegex2.Match(html);
267 if (!match.Success)
268 {
269 _logger.LogWarning("og:image 없음: {Key}", key);
270 return;
271 }
272
273 var imageUrl = match.Groups[1].Value.Trim();
274
275 // 상대 경로면 절대 경로로 변환
276 if (!imageUrl.StartsWith("http", StringComparison.OrdinalIgnoreCase))
277 {
278 var base64 = new Uri(siteUrl);
279 imageUrl = new Uri(base64, imageUrl).ToString();
280 }
281
282 // 3. 이미지 다운로드
283 var imageBytes = await _http.GetByteArrayAsync(imageUrl, ct);
284 await File.WriteAllBytesAsync(tempPath, imageBytes, ct);
285 File.Move(tempPath, destPath, overwrite: true);
286
287 _logger.LogInformation("OG 이미지 캐시 완료: {Key} ← {ImageUrl}", key, imageUrl);
288 }
289 catch (Exception ex)
290 {
291 _logger.LogWarning(ex, "OG 이미지 fetch 실패: {Key} ({Url})", key, siteUrl);
292 if (File.Exists(tempPath)) File.Delete(tempPath);
293 }
294 }

다음을 참조함 : _http, _logger, OgImageRegex, OgImageRegex2.

다음에 의해서 참조됨 : FetchAllAsync().

이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ readonly()

Codemaru.Services.SitePreviewService.readonly ( string Key,
string Url )
staticprivate

Sites 값을 보관합니다.

멤버 데이터 문서화

◆ _http

readonly HttpClient Codemaru.Services.SitePreviewService._http
private

http 값을 보관합니다.

SitePreviewService.cs 파일의 98 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : Dispose(), FetchOneAsync(), SitePreviewService().

◆ _interval

readonly TimeSpan Codemaru.Services.SitePreviewService._interval
private

interval 값을 보관합니다.

SitePreviewService.cs 파일의 89 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : ExecuteAsync(), SitePreviewService().

◆ _logger

readonly ILogger<SitePreviewService> Codemaru.Services.SitePreviewService._logger
private

logger 값을 보관합니다.

SitePreviewService.cs 파일의 80 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : FetchOneAsync(), SitePreviewService().

◆ _wwwRoot

readonly string Codemaru.Services.SitePreviewService._wwwRoot
private

www Root 값을 보관합니다.

SitePreviewService.cs 파일의 71 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : FetchAllAsync(), SitePreviewService().

◆ OgImageRegex

readonly Regex Codemaru.Services.SitePreviewService.OgImageRegex
staticprivate
초기값:
= new(
@"<meta[^>]+property=[""']og:image[""'][^>]+content=[""']([^""']+)[""']",
RegexOptions.IgnoreCase | RegexOptions.Compiled)

Og Image Regex 값을 보관합니다.

SitePreviewService.cs 파일의 47 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : FetchOneAsync().

◆ OgImageRegex2

readonly Regex Codemaru.Services.SitePreviewService.OgImageRegex2
staticprivate
초기값:
= new(
@"<meta[^>]+content=[""']([^""']+)[""'][^>]+property=[""']og:image[""']",
RegexOptions.IgnoreCase | RegexOptions.Compiled)

Og Image Regex2 값을 보관합니다.

SitePreviewService.cs 파일의 59 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : FetchOneAsync().


이 클래스에 대한 문서화 페이지는 다음의 파일로부터 생성되었습니다.: