如何有效地读取AWS S3对象并作为视图模型返回

时间:2012-03-11 01:07:24

标签: asp.net-mvc-3 amazon-s3 appharbor

我在AppHarbor上托管的ASP.NET MVC应用程序中存储S3上的json位。我可以毫无问题地读取,写入,删除等S3。大多数互动都非常快。但是,当我在当前实现中读取内容时,内容非常缓慢。

控制器中的代码非常简单,直接调用与S3对话的仓库:

public class ContentController : Controller
{
    public ActionResult LoadContent(string slug)
    {
        IContentRepository repo = new S3ContentRepository(ConfigurationManager.AppSettings["BucketName"]);
        var content = repo.GetContent(slug);
        return View(content);
    }

}

在回购中,我对S3的读取速度非常快。它将对象从S3中取出,将其放入内存,将其组装为字符串,然后将其转换为json,然后将json转换回我的模型。这里没有滞后。

public Content GetContent(string slug)
    {
        Content result = null;
        using (client = Amazon.AWSClientFactory.CreateAmazonS3Client())
        {
            try
            {
                GetObjectRequest request = new GetObjectRequest().WithBucketName(_bucketName).WithKey(slug);

                using (GetObjectResponse response = client.GetObject(request))
                {
                    string title = response.Metadata["x-amz-meta-title"];

                    byte[] arr = new byte[response.ContentLength];
                    response.ResponseStream.BeginRead(arr, 0, Convert.ToInt32(response.ContentLength), null, null);
                    string json = new System.Text.ASCIIEncoding().GetString(arr);
                    result = JsonConvert.DeserializeObject<Content>(json);
                    return result;
                }
            }

            ...

        }
    }

然而,一旦我将模型从repo返回到控制器,请求就会严重滞后。我的本地机器的性能与AppHarbor中的性能相同。字面上的秒数在页面加载之前经过。视图代码只是从作为其模型的类生成的......非常简单。

思想?

更新1:在进一步探讨时,我发现滞后在响应流关闭的某个地方。我已经添加了一个特定的调用来“关闭”流......这就是最常见的延迟。这之前留给using语句来处理响应对象的死亡。需要更多戳戳......

更新2:我没有放弃这个,因为我认为我应该能够将S3中的对象直接读入内存而没有任何问题但是为了时间的关系我交换了我的实现从S3写入本地系统然后将本地文件加载到内存中。相当蹩脚..但在我解决这个问题之前已经足够了!我会继续寻求更好的解决方案。虽然使用本地文件,但我可以在S3停止响应的基础上实现“失败优雅”解决方案...基于文件的缓存! :)

1 个答案:

答案 0 :(得分:0)

听起来像序列化问题。我会检查你反序列化的json对象的复杂性是嵌套对象,如果可以,你可以将它展平吗?