c# - IIS 和 IIS Express 在本地为 MVC4 Azure 应用程序引发 403 错误

标签 c# asp.net-mvc azure

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

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

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

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

我也尝试过this SO answer中的解决方案。那里也没有骰子。

我还尝试将我的 Azure Web 角色切换为在 IIS 而不是 IIS Express 中运行。我也遇到同样的 403 错误。为了彻底起见,我确实运行了 aspnet_regiis -ir,即使在我的计算机上本地运行(非 Azure)的其他 MVC 应用程序工作得很好。

编辑 所以这很有趣...当我按 F5(我的 Azure 项目是我的启动项目)时,Azure 计算/存储模拟器启动,然后我的浏览器打开到 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。

有什么想法吗?

最佳答案

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

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

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.

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

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

This answer also could lead you to some options how to fix\deal with that.

希望对你有一点帮助

关于c# - IIS 和 IIS Express 在本地为 MVC4 Azure 应用程序引发 403 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16326264/

相关文章:

C# - 迭代在没有显式 IEnumerable 的情况下工作

c# - RestSharp 获取序列化输出

c# - 在业务层使用Server.MapPath

asp.net-mvc - 返回 View 作为 JSON 对象的一部分

c# - Azure 云服务上的 Umbraco 7.0.2 - 访问路径 'E:\sitesroot\1\config\applications.config' 被拒绝

c# - 由于程序集名称而导致 MEF 组合错误?

c# - 使用 C# 为 Windows 设置默认打印机

c# - MVC JsonNetResult - 序列化 List<ListItem> 时为 "dataloss"

azure - 使用重复触发器以编程方式触发逻辑应用

c# - Azure SuggestAsync 映射到 POCO