Asp.net mvc 3 如何高效地读取AWS S3对象并作为视图模型返回
我在S3上存储来自AppHarbor上托管的ASP.NET MVC应用程序的json位。我能够读,写,删除等S3没有任何问题。大多数互动都相当快。然而,在读取内容时,我当前实现中的某些内容进展非常缓慢 控制器中的代码非常简单,直接调用与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
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对象的复杂性,它是嵌套对象吗?如果是,您可以将其展平吗?它几乎只是一个属性包。一个包含一系列字符串和几个日期的类。没有复杂性。序列化之前和之后的步骤都非常快。它位于控制器和视图之间……至少看起来是这样。它几乎只是一个属性包。一个包含一系列字符串和几个日期的类。没有复杂性。序列化之前和之后的步骤都非常快。它位于控制器和视图之间……至少看起来是这样。