4

我有一个最近迁移到 Azure Web 角色的 C# MVC4 应用程序。我可以在 Azure 平台上很好地发布/运行该站点,但是当我尝试使用 Azure 开发结构在本地运行它时,IIS 和 IIS Express 会抛出一个通用的 403 错误。

正如我在许多帖子中提到的那样,我尝试将以下内容添加到我的 web.config 中,但它没有帮助。无论如何,这个解决方案似乎有点像大锤方法,因为它通过托管管道运行所有请求,但仍然认为我会试一试。

  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"></modules>
    <handlers>
      <remove name="UrlRoutingHandler"/>
    </handlers>
  </system.webServer>

我已经验证我可以访问我的应用程序根目录中的“robots.txt”文件,以便服务器启动并指向正确的位置,但它不会为我的任何 MVC 页面提供服务。

我也尝试了这个 SO answer中的解决方案。那里也没有骰子。

我还尝试将我的 Azure Web 角色切换为在 IIS 而不是 IIS Express 中运行。我在那里得到相同的 403 错误。为了彻底一点,我确实运行了aspnet_regiis -ir,即使在我的机器上本地运行的其他 MVC 应用程序(非 Azure)运行良好。

编辑 所以这很有趣......当我点击 F5(我的 Azure 项目是我的启动项目)时,Azure Compute/Storage 模拟器启动,然后我的浏览器打开到http://127.0.0.1:81/. 这是我收到 403 错误的 URL。

但是,如果我使用的是 IIS(不是 Express)并且我访问 Azure 在部署期间创建的 IIS 中的网站,请右键单击“管理网站”,然后选择“浏览”,它会在http://localhost:82/. 注意“localhost”而不是 127.0.0.1 和端口 82 而不是 81,它可以工作!我可以毫无问题地浏览我的网站,点击断点等。现在,如果我尝试http://127.0.0.1:82(使用 IP,但使用端口 82),我仍然会得到 403。

有任何想法吗?

4

1 回答 1

1

我无法得到您要问的确切问题,但我可以尝试解释为什么您的网站会以这种方式运行(我们的项目中的行为非常相似)。我不确定这是对这种行为的 100% 正确解释,但我有 AFAIK:1. 您的 IIS 和 IIS Express 不能同时使用相同的端口。2. Azure Compute Emulator 运行它自己的堆栈\负载平衡代理(模拟多实例 azure 环境)并且需要在某个端口上注册自己。

那么为什么会发生这种情况:您的 IIS 中可能有一些其他站点使用端口 80。因此,当模拟器启动时 - 它发现端口 80 无法使用(因为它被您的工作 iis 锁定)。它开始进行端口遍历,直到找到下一个要绑定的空闲端口(对我们来说它将是 81 和 444)。您可以在启动 F5 后检查 General Output 窗口,您可以在那里找到类似的消息:

Windows Azure Tools: Warning: Remapping public port 80 to 81 to avoid conflict during emulation.
Windows Azure Tools: Warning: Remapping public port 443 to 444 to avoid conflict during emulation.
Windows Azure Tools: Warning: Remapping private port 80 to 82 in role 'MvcApplication' to avoid conflict during emulation.
Windows Azure Tools: Warning: Remapping private port 443 to 446 in role 'MvcApplication' to avoid conflict during emulation.

所以模拟器在公共端口 81\444 上注册了他的负载平衡端点,并在 82\446 上暴露了某种内部端点。但我怀疑 '127.0.0.1' 和 'localhost' 的行为有点不同(我知道这是同一件事,只是怀疑 IP url 会通过一些不同的管道,但我无法证实我的猜测)并且,特别是如果您在一个角色中有多个站点 - 127.0.0.1 将无法访问正确的端点(可能是因为它不包含正确的主机标头?)。

这会导致 localhost:444(在我们的例子中)正常工作而 127.0.0.1:444 不能正常工作的情况。

这个答案也可以引导您选择一些如何解决\处理的选项。

希望对你有一点帮助

于 2013-05-13T02:53:07.573 回答