【问题标题】:Web API interface works locally but gets 404 after deployed to Azure WebsiteWeb API 接口在本地工作,但在部署到 Azure 网站后得到 404
【发布时间】:2012-11-05 06:46:02
【问题描述】:

我正在开发一个 ASP.NET MVC 4 网站。连同 MVC 控制器,我有一个 API 控制器,其中包含一个 ajax GET API 接口。当使用 Visual Studio 在本地调试时,它可以完美运行。

但是,在我将其部署为 Azure 网站后,MVC 控制器可以工作,但 API 控制器不再工作。当 jQuery 代码尝试访问它时,它会返回如下响应:

未找到与请求 URI 'http://example.com' 匹配的 HTTP 资源。

看起来至少该路由有效(否则,将返回另一个 404 响应正文。)。

此外,我将另一个纯 MVC 4 Web API 服务部署为 Azure 云服务。它完美地工作。因此,我想知道是什么导致 MVC 网站内的 API 失败?谢谢!

【问题讨论】:

  • 让我们看看我们是否可以通过配置 Web API 来显示更多错误详细信息来获取更多信息。只是为了快速调试,您可以将以下内容添加到 global.asax.cs 文件中:GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; 然后使用 Fiddler 观察返回的请求和响应。在回复中,我们现在希望有一些额外的信息来帮助我们调试。
  • 感谢马克的提示。这次的详细信息是:没有找到与名为“xxxx”的控制器匹配的类型。
  • 好的,然后运行 ​​Youssef 建议的检查。虽然我很惊讶你在本地调试时没有同样的问题。
  • MVC 是否有可能未正确部署到 Azure?
  • 我有完全相同的问题,Web Api 应用程序在本地和云服务 Web 角色机器上运行良好,但在 AWS 中却没有。此外,除了“没有找到任何类型匹配名为“xxx”的控制器”

标签: .net asp.net-mvc-4 asp.net-web-api http-status-code-404 azure-cloud-services


【解决方案1】:

检查他们通常有帮助的这些事情:

  1. 确保您的控制器类型是公开的并且派生自 ApiController
  2. 确保控制器名为“xxxxController”,其中 xxxx 是控制器名称

在这种情况下,URL api/xxxx 应该可以工作。

【讨论】:

  • 感谢您提供支票。但是,正如我所提到的,它们都是正确派生或命名的,并且在本地调试中运行良好。
【解决方案2】:

这是一个常见的问题当一个MVC应用程序部署在IIS上时,调用你的Web API暴露的REST服务的HTTP url会改变。如果您的 api 控制器名为 MyApiController,那么在生产环境中,您应该在调用 URL 之前添加应用程序名称。这意味着 /api/MyApi 将变为 /MyApp/api/MyApi。 MyApp 是您网站的前缀 (yourwebsite/MyApp)。

【讨论】:

    【解决方案3】:

    我解决了这个问题。 我使用 Telerik DataAccess 作为我的 ORM,项目应该有 Copy LocalTrue

    同样,如果它们似乎是 3rd 方 dll 或来自 nuget,则将所有引用添加为 Copy Local=True

    您可以通过在 Web.config 文件中的 <system.web> 中添加 <customErrors mode="Off" /> 来更轻松地查找错误。

    【讨论】:

      【解决方案4】:

      我们通过基于属性的路由为控制器命名,并为控制器内的每个端点命名。出于安全原因,不允许使用常规的 GET、PUT、POST、PATCH。

      网络安全和我们的 DevOps 要求它用于防火墙日志、性能监控和安全监控。

      考虑使用:

          [Route("api/inventory")]
          public class InventoryController : ApiController
          {
            [HttpGet("inventorylist")]
            public IActionResult InventoryList() 
            { 
            }
      
            [HttpGet("inventoryitem")]
            public ActionResult InventoryItem([FromQuery] string itemId) 
            {
            }
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-20
        • 1970-01-01
        • 2012-09-17
        • 2017-12-17
        • 2016-04-17
        • 1970-01-01
        • 1970-01-01
        • 2023-03-06
        相关资源
        最近更新 更多