从blob存储器下载到webrole的html文件有403和404错误

时间:2013-01-21 19:37:42

标签: 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这样的域名。

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

因此,从目前为止我可以推断出整个网站Azure caches似乎已部署,似乎不允许内容更改。

有没有办法强制Azure识别更改,或者只要对静态.html页面进行更改,我们就会被迫重新部署?

1 个答案:

答案 0 :(得分:1)

当您部署webrole以在Azure上运行时,它实际上打包了Web角色的两个副本。一个最终在AppRoot下,一个最终在SitesRoot下。

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

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

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