我有一个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。
我确定我错过了一些非常愚蠢的东西,但我只是想不通。
答案 0 :(得分: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
...
}