在ASP.NET web api中使用文件的良好实践?

时间:2015-06-29 10:35:17

标签: c# asp.net file azure asp.net-web-api

我是新工作的文件,所以我做了一些阅读,尽管我觉得我仍然不确定如何使用asp.net web api处理它们。 我想要的是能够通过我的网络API获取图像。到目前为止我所读到的是,许多人更喜欢保存文件,然后调用它的URI,而不是将图像保存到数据库,只保存URI。然后我在web api上创建了一个imageController,它正是这样做的(Atleast使用localhost工作)。我现在让一些人争辩说我应该使用blob存储(因为我使用Azure)。

我的问题是:在我保存图像文件的项目中有一个文件夹是错误还是不好?那么保存图像的更好方法是什么?

2 个答案:

答案 0 :(得分:2)

你的问题实际上是两个问题:

1。数据库与文件系统

这取决于两个主要因素:安全性和性能。

如果您的图片是敏感的,并且在应用程序“外部”访问它们的风险(例如通过热链接)是不可接受的,您必须使用数据库,并通过ASP.NET请求提供图像 - 您可以通过任何方式验证想。然而,这比第二种选择(见下文)更加耗费资源。

如果安全性无关紧要,那么您肯定想要进行文件系统存储。在传统托管上,您可以将它们“保存在磁盘上”,IIS(Web服务器)将为用户提供服务(通过直接URL,绕过您的ASP.NET应用程序)。仅此一点就是DB + ASP.NET解决方案的巨大性能改进,原因有很多(请求线程池,内存压力,平均请求持续时间,IIS上的缓存......)。

2。 webrole与blob存储的本地目录

但是,在Azure中,你可以,而且还需要更进一步 - 使用专用的blob存储,独立于你的web角色,所以即使你的webrole上的IIS也不会为它们提供服务,而是blob存储上的专用服务器(这样做)根本不需要关心你 - 它只是有效。您的Web角色不应永久存储任何内容 - 它可能会在Azure结构中随时失败,被销毁并替换为新的。所有永久性内容必须转到Azure blob存储。

答案 1 :(得分:2)

添加@ rouen的优秀答案(我将只关注本地目录v / s blob存储)。

假设您将WebApi部署为Azure Web应用程序(而不是Web角色),请考虑以下方案:

  • 如果意外删除了您的Web应用程序,您的图像会发生什么。在这种情况下,您的所有图像都将丢失。
  • 如果您需要将应用程序从一个实例扩展到多个实例,会发生什么。由于文件位于实例本地目录中,因此不会跨其他实例复制它们。如果获取图像的请求落在VM上没有图像的实例上,那么您将无法提供该图像。
  • 如果您需要存储的图像数量超过Web应用程序中可用的磁盘大小,会发生什么情况?
  • 如果您需要通过其他应用程序(WebApi除外)提供相同的图像,会发生什么情况?

考虑到所有这些,我的建议是使用blob存储。您要做的是将图像存储在blob存储中并将图像URL保存在数据库中。 blob存储提供的一些优点是:

  • 目前,您可以在一个blob存储帐户中存储500 GB的数据。如果您需要更多空间,只需创建另一个存储帐户即可。目前,您可以为每个订阅创建100个存储帐户,因此基本上您可以在一个订阅中存储50TB的数据。
  • Blob存储很便宜,您只需支付使用的存储空间+存储交易成本也非常便宜。
  • blob存储中的内容被复制三次,如果您选择地理冗余选项(这需要额外费用),您的内容将被复制六次(主要区域为三次,次要区域为三次)。但是你不应该confuse replication with backup
  • 由于内容是从blob存储中提供的,因此您实际上可以释放IIS服务器来提供该内容。
  • 您可以利用Azure CDN并从距离最终用户最近的CDN节点提供内容。

考虑到所有这些优点,我强烈建议您查看blob存储。