Exemple #1
0
        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());
            }
        }