【问题标题】:What is the best place to place static files in asp.net mvc application?在 asp.net mvc 应用程序中放置静态文件的最佳位置是什么?
【发布时间】:2012-01-17 06:22:28
【问题描述】:

例如,我在路径 D:/myprojects/sample 中有一个 Asp.net MVC 应用程序,我在 E:/files 中放置了静态文件。

我不想将静态文件放在内容文件夹中,因为静态文件的大小非常大。是否可以在我的应用程序中使用 E:/files 中的文件?怎么样?

我想在框架内显示静态 html 文件,如下所示

&lt iframe id="content-frame" src="E:/files/index.html" width="100%" frameborder="0">

但我在 Firefox 中收到警报,因为“Firefox 不知道如何打开此地址,因为协议 (e) 未与任何程序关联”。

如果在 IIS 中创建虚拟目录会解决这个问题吗?

感谢您的回复。

【问题讨论】:

  • 您希望这些文件可以从客户端访问吗?

标签: asp.net-mvc-3


【解决方案1】:

只要您有权限,您就可以将文件存储在文件系统上的任何位置。但是,将它们保存在应用程序目录中通常是有意义的。

一个好地方是根目录下的 App_Data 文件夹。原因是 App_Data 文件夹中的文件无法通过 HTTP 直接访问 - 服务器返回 404 错误。例如,如果您将来需要将这些文件的访问权限仅限于授权用户,这可能会很有用。

由于您使用的是 MVC,因此您需要在此文件夹中设置到服务器文件的路由,如下所示:

public FilePathResult GetFile(string path)
{
    return File(Path.Combine(Server.MapPath("~/App_Data/"), path), "image/jpeg");
}

因此,可以在您的标记中使用一个文件,例如:

@Url.Action("GetFile", new { controller = "Files", path = "myimage.jpg" })

您可能不想直接传递文件路径,因为这只是一个示例(也许可以传递一个 id),但您知道它是如何工作的。

【讨论】:

  • +1 有一些清晰的例子和很好的解释。我也建议设置一条路线,并使用 ~ 约定。否则,您在部署时可能会遇到问题。
【解决方案2】:

这实际上取决于这些“静态”文件的性质以及客户或您想要对它们做什么。

如果它们只是在服务器上被访问,那没关系,只要进程运行的身份具有必要的权限。

如果它们要被客户端访问,那么您需要提供这些文件。

如果它们是 HTML 文件,那么您可以将它们转储到您想要的任何文件夹中。 Content 文件夹对我来说似乎是一个合理的地方,所以我很想知道你为什么“不想”。

图片和其他东西,当然也有文件夹。

但是您必须考虑这些静态文件是否在网站部署过程之外进行更新。如果是这样,那么请考虑在 IIS 中创建一个简单的虚拟目录,指向这些文件在原地更新的位置 - 这样您就不必担心它们。

在我看来,使用路由和通过控制器传递请求作为最后的手段,因为它不必要地使 IIS 可以轻松地直接提供服务的文件的请求管道复杂化。

【讨论】:

    【解决方案3】:

    你可以把它放在任何地方。

    在 IIS 中,您可以有一个指向该地址的 virtualDirectory。

    例如,

    让您的静态文件位于“E:/files”中

    在 IIS --> YourWebSite --> 添加一个 VirtualDirectory(假设是“内容”并指向“E:/files”。

    现在您可以从外部访问它,例如,

    http://YourWebSite/content/myimg.png

    它就像文件放在同一目录中一样。

    【讨论】:

      【解决方案4】:

      编辑 - 有关App_Data What is the App_Data folder used for in Visual Studio?的更多详细信息

      你可以使用

      App_Data
      我认为这是存储静态内容的绝对位置。

      【讨论】:

      • 不,它不是,app_Data 用于数据 - 因此它的名字。来自 microsoft:“包含应用程序数据文件,包括 .mdf 数据库文件、XML 文件和其他数据存储文件。ASP.NET 使用 App_Data 文件夹来存储应用程序的本地数据库,例如用于维护成员资格和角色信息的数据库。有关详细信息,请参阅成员资格简介和了解角色管理。”
      • 感谢@adam 的澄清,我知道资源文件存储在 App_Data 中。问题是如果您不想将静态内容存储在 Content 文件夹中,那么您可以放在哪里?我的选择 App_Data !
      • 在内置文件夹之外的任何文件夹中。 app_data 有一个特定的目的,它绝对不是静态内容。静态内容只是进入通过 iis 映射的任何文件夹。再次 - 虽然不是 app_data !资源文件本质上是数据库,尽管有 app_localresources 和 app_globalresources。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-31
      • 1970-01-01
      • 2011-11-30
      • 1970-01-01
      • 2010-09-10
      • 1970-01-01
      相关资源
      最近更新 更多