Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 如何高效地读取AWS S3对象并作为视图模型返回_Asp.net Mvc 3_Amazon S3_Appharbor - Fatal编程技术网

Asp.net mvc 3 如何高效地读取AWS S3对象并作为视图模型返回

Asp.net mvc 3 如何高效地读取AWS S3对象并作为视图模型返回,asp.net-mvc-3,amazon-s3,appharbor,Asp.net Mvc 3,Amazon S3,Appharbor,我在S3上存储来自AppHarbor上托管的ASP.NET MVC应用程序的json位。我能够读,写,删除等S3没有任何问题。大多数互动都相当快。然而,在读取内容时,我当前实现中的某些内容进展非常缓慢 控制器中的代码非常简单,直接调用与S3对话的回购协议: public class ContentController : Controller { public ActionResult LoadContent(string slug) { IContentRepo

我在S3上存储来自AppHarbor上托管的ASP.NET MVC应用程序的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;
                }
            }

            ...

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

想法

更新1:在多戳一点的时候,我发现延迟在响应流关闭的某个地方。我添加了一个特定的调用来关闭流…这就是最容易感觉到延迟的地方。这之前留给using语句来处理响应对象的死亡。需要更多的戳


更新2:我没有放弃这一点,因为我认为我应该能够将S3中的对象直接读取到内存中,而不会出现任何问题,但为了节省时间,我交换了实现,从S3写入本地系统,然后将本地文件加载到内存中。很蹩脚…但在我解决这个问题之前已经足够好了!我会继续寻找更好的解决办法。虽然有了本地文件,我可以在S3停止响应的情况下实现一个失败解决方案…基于文件的缓存!:

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

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

它几乎只是一个属性包。一个包含一系列字符串和几个日期的类。没有复杂性。序列化之前和之后的步骤都非常快。它位于控制器和视图之间……至少看起来是这样。它几乎只是一个属性包。一个包含一系列字符串和几个日期的类。没有复杂性。序列化之前和之后的步骤都非常快。它位于控制器和视图之间……至少看起来是这样。