html - 从 blob 存储下载到 webrole 的 html 文件出现 403 和 404 错误

标签 html asp.net-mvc-3 iis azure http-status-code-404

我正在尝试对遇到大量流量峰值的网站使用静态 .html 页面。该网站是一个 MVC3 应用程序。静态 .html 页面的目录结构如下所示:

approot
|---content
        index.html
    |---staticpages
            page1.html
            page2.html
            page3.html

我已将 web.config 中的 defaultDocument 设置为 “content/index.html”。如果我只是将 .html 文件包含在项目中并部署应用程序,它就可以正常运行。

我们想要做的是将所有 html 文件作为 blob 放入存储容器中。后台任务(在 WebRole 中运行)定期检查任何更新的文件。服务器启动时,后台任务还会检查 .html 文件是否存在或是否需要更新。理想情况下,我们宁愿不必在项目中包含 .html 文件,而只需在服务器启动时从存储中获取它们。

后台任务会下载文件并将它们放入正确的目录中。但是,当尝试访问 www.mysite.com 网站时,IIS 返回 403 错误。如果我们尝试访问任何其他 .html 页面,我们会收到 404 错误。在本地开发环境中测试 MVC 应用程序时不会发生这种情况。

当我在 IIS 中打开目录浏览时,获取站点目录时不会出现任何文件或目录。再次仅使用 www.mysite.com 等域名。

如果我确实将 .html 文件包含在 webrole 项目中,然后尝试更新存储中的文件,则会从存储中提取 blob,但 IIS 提供旧页面。我已删除浏览器缓存以确保这不是问题。新文件正在服务器上正确更新。我把它复制到本地机器上查看了一下,确实是更新后的版本。

因此,从目前为止我可以推断的情况来看,Azure 会在部署时缓存整个网站,并且似乎不允许内容更改。

是否有办法强制 Azure 识别更改,或者每当静态 .html 页面发生更改时我们是否将被迫重新部署?

最佳答案

当您部署 WebRole 以在 Azure 上运行时,它实际上打包了 Web Role 的两个 个副本。一种最终位于 AppRoot 下,另一种最终位于 SitesRoot 下。

您的 WebRole.OnStart 进程在 AppRoot 中运行,但您的网站实际上是通过 SitesRoot 中的副本提供服务的。因此,问题在于您的代码正在愉快地运行并从 Blob 存储中复制文件,但它们位于 AppRoot 下,因此对您的网站不可见。

您需要在 global.asax 中启动一个线程来进行复制,或者修改您的代码以询问 IIS 以获取您网站的实际路径并修改它以将文件复制到那里。后者可能是更安全的方法。

当您在本地模拟器中运行时,所有内容都从主构建目录运行,因此行为有所不同。

关于html - 从 blob 存储下载到 webrole 的 html 文件出现 403 和 404 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14445933/

相关文章:

html - 将 HTML 作为组织模式标记粘贴到组织模式中?

javascript - innerHtml.replace 替换标签而不仅仅是文本

javascript - 跟踪哪个列表元素被点击并将此数据传输到 PHP

asp.net - 如何在 SlickGrid 中智能地设置日期时间格式?

iis - 使用 IIS 在同一台服务器上运行 node.js 和 Web API

php - HTML5分页

css - 使用 Razor 将 CSS 转换为样式元素

asp.net-mvc - 我可以通过给它一个类来自定义 @using Html.BeginForm() 吗?

.net - 在 WCF 服务中,如何公开只能访问某些方法的第二个端点?

iis - 在 IIS8.5 中设置 MaxWebConfigFileSizeInKB