我的 .net 核心 3.1 mvc 操作 return 404 发布到 azure 应用程序服务时

My .net core 3.1 mvc actions return 404 when published to azure app service

我正在创建一个 ASP.NET Core 3.1 站点,现在已经向 Azure 应用服务发布了一个测试版本。

当我 运行 我的 web 应用程序在本地主机上时,它工作得很好,但是当我 运行 发布的应用程序时,似乎有些操作不再存在(我知道它们存在,否则就是编译错误),我得到的只是 404 未找到。

我发布时出现的一个动作示例是“登录”,它接收电子邮件和代码并位于 HomeController 中:

public IActionResult LogIn(string email, string code)
{
    //Code
    return Json(jObject);
}

此操作通过此 Ajax 代码调用:

$.ajax({
    type: "GET",
    url: "/Home/LogIn",
    data: { email: email, code: code },
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function (response) {

    },
    error: function (response) {
        console.log(response);
    }
});

ajax 调用 returns 404 在已发布的应用程序中未找到。 但我也试图通过创建一个“a”标签来做同样的事情:

<a asp-action="LogIn" asp-controller="Home" asp-route-email="test@test.com" asp-route-code="123">Login</a>

但是 returns 404 也没有找到...

我尝试过的解决方案:

向动作(和控制器)添加路由值:

[Route("Home/LogIn")]
public IActionResult LogIn(string email, string code)
{
    //Code
    return Json(jObject);
}

将 ajax 代码移至 .cshtml 文件并将 url 更改为:

url: "@Url.Action("LogIn", "Home")"

但是 none 这些解决方案解决了我的问题...

有没有人认识到这个问题?有人有解决方案吗?非常感谢您的帮助。

提前致谢!

编辑:

我已经测试删除“登录”操作的所有内容并将其替换为“return View()”并为其创建一个视图,它工作正常。也可以通过 ajax 调用找到“登录”操作,但是当我再次添加我想要的代码并发布时,该操作再次出现 404 未找到...

然后我尝试将 [HttpGet] 添加到操作中,结果导致不允许使用 405 方法。所以我认为它看到了动作但忽略了它或类似的东西。

这是为您提供的诊断解决方案。

  1. 由于您的项目在本地主机上运行良好,您可以像下面那样发布为文件夹,这会给您一个像第二张图片那样的文件夹。
  2. 在本地计算机上通过 IIS 测试项目。实际上,如果该项目在 IIS 上运行良好,那么它在 Azure 上也应该运行良好。(路径是您从步骤 1 中创建的文件夹路径)
  3. 压缩您在步骤 1 中创建的发布文件夹的内容,并将其拖动到应用服务的 kudu 站点,如下所示:
  4. 如果以上步骤都没有问题,说明你的项目没问题。检查你的部署方法,并确保在部署时没有文件丢失。

温馨提示:如果还是不能确定文件是否丢失,可以像myproject.dll一样在bin文件夹下找到方法,反编译文件,查看源代码是否存在。

已解决!

我解决了问题。

我正在查看 azure 应用程序服务日志,并在调用时发现了这个:

2020-12-04 19:14:57.864 +00:00 [Information] Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker: Route matched with {action = "LogIn", controller = "Home"}. Executing controller action with signature Microsoft.AspNetCore.Mvc.IActionResult LogIn(System.String, System.String) on controller Project.Controllers.HomeController.

在日志流的更下方显示了:

2020-12-04 19:14:57.929 +00:00 [Error] Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware: An unhandled exception has occurred while executing the request.System.Data.SqlClient.SqlException (0x80131904): Cannot open server 'mysrvname' requested by the login. Client with IP address 'appserviceIP' is not allowed to access the server.

所以问题是所有使数据库调用“未找到”的操作,但它们实际上得到了 sqlexecptions,因为我忘记更新我的服务器防火墙规则以接受我的应用程序服务 IP 地址。

当我应该得到一些服务器错误时,我得到了一个 404 not found 真的很奇怪...