public async Task <ScoreMeta> GetScoreMetaAsync(string scoreName) { var convertor = new ScoreMetaConvertor(); var key = $"{scoreName}/{ScoreMeta.FileName}"; Stream currentStream; try { var request = new GetObjectRequest { BucketName = BucketName, Key = key, }; var response = await this.S3Client.GetObjectAsync(request); currentStream = response.ResponseStream; } catch (AmazonS3Exception e) { if (e.ErrorCode == "NoSuchKey") { throw new InvalidOperationException($"'{scoreName}' は存在しません"); } throw; } var scoreMeta = await convertor.ConvertToScoreMeta(currentStream); return(scoreMeta); }
public async Task SaveScoreMetaAsync(string scoreName, ScoreMeta scoreMeta, string metaKey) { var convertor = new ScoreMetaConvertor(); var key = $"{scoreName}/{ScoreMeta.FileName}"; int retryCount = 5; for (int i = 0; i < retryCount; i++) { try { var stream = await convertor.ConvertToUtf(scoreMeta); var putRequest = new PutObjectRequest { BucketName = BucketName, Key = key, InputStream = stream, CannedACL = S3CannedACL.PublicRead, }; await this.S3Client.PutObjectAsync(putRequest); } catch (AmazonS3Exception) { // Error throw; } try { var request = new GetObjectRequest { BucketName = BucketName, Key = key, }; var response = await this.S3Client.GetObjectAsync(request); var stream = response.ResponseStream; var checkedMeta = await convertor.ConvertToScoreMeta(stream); // 同一のキーが登録される可能性があるがキーには少数3桁の時間を指定してるので // ほぼキーが重なる自体はないと考える // もしキーの重複が問題になる用であれば内容の比較も行う if (checkedMeta.ContainsKey(metaKey)) { return; } } catch (AmazonS3Exception) { // skip } if (i < (retryCount - 1)) { Thread.Sleep(2000); } } throw new InvalidOperationException("追加更新に失敗しました"); }