【问题标题】:My .net core 3.1 mvc actions return 404 when published to azure app service我的 .net core 3.1 mvc 操作在发布到 azure 应用服务时返回 404
【发布时间】:2021-03-16 01:24:30
【问题描述】:

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

当我在 localhost 上运行我的 Web 应用程序时,它工作得很好,但是当我运行已发布的应用程序时,似乎某些操作不再存在(我知道它们存在,否则将是编译错误)并且我所做的一切get back 是 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 调用返回 404 not found 在已发布的应用程序上。 但我也尝试通过创建“a”标签来做同样的事情:

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

但这也返回 404 not found...

我尝试过的解决方案:

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

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

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

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

但是这些解决方案都不能解决我的问题...

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

提前致谢!

编辑:

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

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

【问题讨论】:

    标签: c# ajax asp.net-core azure-web-app-service http-status-code-404


    【解决方案1】:

    这里有一个适合您的诊断解决方案。

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

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

    【讨论】:

    • 非常感谢您的回答!我会尝试一下,但我不太确定在创建 IIS 站点时在“主机名”中放置什么。
    • 保持“主机名”为空即可。
    【解决方案2】:

    已解决!

    我解决了这个问题。

    我正在查看 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...

    【讨论】:

    • 恭喜!很高兴知道您解决了问题。
    • @DorisLv 谢谢!因此我得到一个 404 是不是很奇怪?还是我错过了什么?
    猜你喜欢
    • 1970-01-01
    • 2020-07-10
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多