通过IIS或Controller ActionResults的图像

时间:2010-11-05 18:47:29

标签: asp.net asp.net-mvc

我有一个ASP.NET MVC2应用程序,它维护一个大约10GB图像的库。其中许多都是由应用程序定制的。我们一直在SQL中存储它们,但由于种种原因,我们正在将图像移动到文件系统。

除了文件系统与SQL问题之外,我应该通过控制器上的ActionResults提供我的图像,还是通过IIS和单独的网站直接提供它们?前者提供了许多优点,例如控制缓存和一些动态重定向,但我认为通过IIS直接访问文件会更有效。我自己提供图像的效率有多大?

3 个答案:

答案 0 :(得分:0)

安德鲁,

我的第一个建议是查看SQL Server的Filestream类型。它在SQL与文件系统中存储blob之间提供了良好的效果,同时允许从两个位置进行访问。 See this for more information.

对于您的其他问题,从动作方法提供图像相当简单。 使用所需参数创建方法,而不是返回ActionResult,返回FileResult。然后在该方法中,加载图像并将其返回。

关于此问题的一个注意事项 - 如果可能的话,你真的想要使用流,否则你的内存和延迟会受到影响。如果您可以使用流(通过在磁盘或SQL Server上流式传输文件),则可以返回新的FileStreamResult,传入流和图像的mime类型(例如,“image / png”)。这将为您提供更好的性能和延迟。

就缓存而言,您可以使用MVC缓存属性来处理图像缓存,但需要这样做。

如果这有意义,请告诉我。

埃里克

答案 1 :(得分:0)

最简单的方法是将文件放入服务器上的目录中,并按照其他任何文件的方式引用它们。存在的文件路径优先于MVC路由。我不知道如果您更喜欢通过ActionResults,您会看到任何显着的性能差异。

我通常不担心它,让IIS完成工作是完全可行的。我想这实际上取决于你对响应实际需要多少控制权。如果您只需要在请求时提供图像,那么我只想将它们放在目录中并让IIS为它们提供服务。如果你担心的话,你真的不应该做任何路由配置,因为正如我所说,服务器上存在的文件路径优先于匹配mvc路由。

答案 2 :(得分:0)

这最能解决我的问题和问题

Can an ASP.NET MVC controller return an Image?