public async Task CacheContent <T>(string key, T content, ICacheInfo cacheInfo) { using (var ms = new MemoryStream()) using (var sw = new StreamWriter(ms)) using (var jw = new JsonTextWriter(sw)) { var serializer = new JsonSerializer(); var now = DateTime.UtcNow; serializer.ContractResolver = new DefaultContractResolver { NamingStrategy = new SnakeCaseNamingStrategy() }; serializer.Serialize(jw, content); await sw.FlushAsync(); var putReq = new PutObjectRequest { BucketName = BucketName, Key = key, ContentType = "application/json", // We use the StreamWriter BaseStream, as apparently using a // MemoryStream breaks this part and only uploads an initial partial // segment of the data? F**k knows InputStream = sw.BaseStream, }; putReq.Metadata["content-expiration"] = cacheInfo.ExpiresAt?.ToISOString(); putReq.Metadata["content-creation"] = cacheInfo.CachedAt.ToISOString(); putReq.Metadata["content-hash"] = Sha256.HashContent(ms).ToHexString(); await Client.PutObjectAsync(putReq); } }