public IActionResult GetThumbnail(String?id) { try { using AvailableSongContext availableSongContext = CreateAvailableSongContext(out DbSet <AvailableSong> availableSongs); AvailableSong?availableSong = availableSongs.SingleOrDefault(x => x.Id == id); if (availableSong == null) { // ID が見つからない return(NotAcceptable()); } using ThumbnailContext thumbnailContext = CreateThumbnailContext(out DbSet <Thumbnail> thumbnails); Thumbnail?thumbnail = thumbnails.FirstOrDefault(x => x.Path == availableSong.Path); if (thumbnail == null) { // ID に対応するサムネイルが無い thumbnail = DefaultThumbnail; if (thumbnail == null) { throw new Exception(); } } // キャッシュチェック if (IsEntityTagValid(thumbnail.LastModified)) { Debug.WriteLine("GetThumbnail() キャッシュ有効: " + id); return(NotModified()); } // 実際の運用時はサムネイルの返却に時間がかかることを想定 Random random = new(); Thread.Sleep(random.Next(500, 1000)); Debug.WriteLine("GetThumbnail() キャッシュ無し: " + id); DateTimeOffset lastModified = new DateTimeOffset(YbdCommon.ModifiedJulianDateToDateTime(thumbnail.LastModified)); EntityTagHeaderValue eTag = GenerateEntityTag(thumbnail.LastModified); return(File(thumbnail.Bitmap, thumbnail.Mime, lastModified, eTag)); } catch (Exception excep) { Debug.WriteLine("サムネイル取得サーバーエラー:\n" + excep.Message); Debug.WriteLine(" スタックトレース:\n" + excep.StackTrace); return(InternalServerError()); } }
public IActionResult GetThumbnail(String?id) { try { RegisteredUser?registeredUser = null; if (String.IsNullOrEmpty(id)) { // 引数が空の場合は、ゲストのプロフィール画像を返す if (DefaultGuestUserThumbnail == null) { throw new Exception(); } registeredUser = new() { Bitmap = DefaultGuestUserThumbnail.Bitmap, Mime = DefaultGuestUserThumbnail.Mime, LastModified = YbdConstants.INVALID_MJD, }; } else { using UserProfileContext userProfileContext = CreateUserProfileContext(out DbSet <RegisteredUser> registeredUsers, out _, out _); registeredUser = registeredUsers.SingleOrDefault(x => x.Id == id); if (registeredUser == null) { return(NotAcceptable()); } // 指定されたユーザーにプロフィール画像が設定されていない場合 if (registeredUser.Bitmap.Length == 0) { Thumbnail?defaultThumbnail; if (registeredUser.IsAdmin) { defaultThumbnail = DefaultAdminUserThumbnail; } else { defaultThumbnail = DefaultRegisteredUserThumbnail; } if (defaultThumbnail == null) { throw new Exception(); } registeredUser = new() { Bitmap = defaultThumbnail.Bitmap, Mime = defaultThumbnail.Mime, LastModified = YbdConstants.INVALID_MJD, }; } } // キャッシュチェック DateTime lastModified = YbdCommon.ModifiedJulianDateToDateTime(registeredUser.LastModified); if (IsEntityTagValid(YbdCommon.DateTimeToModifiedJulianDate(lastModified))) { Debug.WriteLine("GetThumbnail() プロフィール画像キャッシュ有効: " + id); return(NotModified()); } // プロフィール画像を返す Debug.WriteLine("GetThumbnail() プロフィール画像キャッシュ無効: " + id); EntityTagHeaderValue eTag = GenerateEntityTag(registeredUser.LastModified); return(File(registeredUser.Bitmap, registeredUser.Mime, lastModified, eTag)); } catch (Exception excep) { Debug.WriteLine("プロフィール画像取得サーバーエラー:\n" + excep.Message); Debug.WriteLine(" スタックトレース:\n" + excep.StackTrace); return(InternalServerError()); } }