Azure App Service 404中的ASP.NET Core API

时间:2019-04-12 20:22:27

标签: azure asp.net-core-webapi

我有一个Azure应用服务中托管的ASP.NET Core 2.1应用。在本地执行时,我可以访问控制器。但是,当我在Azure应用程序中托管时,会收到404。这是复制的最少步骤。

在Visual Studio 2017中添加一个新项目。选择“ ASP.NET Core Web应用程序”。选择ASP.NET Core 2.1,API项目模板,不进行身份验证,配置HTTPS。以自托管的方式运行新应用(不使用IIS)。浏览到https://localhost:5001/api/values。我得到了预期的响应(尽管命令行上有一个关于无法验证HTTPS连接的异常)。

右键单击项目,然后选择发布。选择以创建新的应用程序服务。我选择了现有的订阅,托管计划和资源组。我保留了默认的应用名称。创建应用。

浏览到URL https://app_name.azurewebsites.net,我看到了默认页面。浏览到https://app_name.azurewebsites.net/api/values,然后看到404。

我确定我错过了一些非常愚蠢的东西,但我只是想不通。

2 个答案:

答案 0 :(得分:2)

我能够重现该错误,以下解决方案为我工作。如果您没有尝试过,请尝试一下。

  1. 在将应用程序发布到Azure之前,请确保将配置设置为“发布模式”。
  2. 在ValuesController中的GET方法顶部添加 [Route(“ /”)] 属性,如下所示。

    [Route("/")]
    [HttpGet("{id}")]
    public ActionResult<string> Get(int id)
    {
        return "value";
    }
    

基本上,任何没有路由属性的控制器方法都使用基于约定的路由。

使用[Route]属性时,将定义属性路由,因此该操作/控制器不使用常规路由。

作为一种选择,您可以使用以下事实:属性路由可以与继承结合在一起。在整个控制器上设置一个Route属性,它将用作路由前缀(与WebApi中的[RoutePrefix]属性相同的行为):

[Route("api/[controller]")]
public class ValuesController: ControllerBase
{

}

希望这会有所帮助。

答案 1 :(得分:2)

就我而言,我已经完全删除了Home控制器,但是无意中将app.UseExceptionHandler中的Startup.Configure中间件指向默认的Home/Error

因此,当我的应用程序部署到Azure时,发生了在本地测试期间没有收到的异常(例如SQL防火墙IP阻止问题),这意味着重定向到错误页面的结果均为404。

if (env.IsDevelopment())
   ...
else
{
    app.UseExceptionHandler("/Home/Error"); << Watch for this
    ...
}
相关问题