【问题标题】:ASP.NET Core Web Api controller end points are all returning 404 errorASP.NET Core Web Api 控制器端点都返回 404 错误
【发布时间】:2021-07-14 21:34:46
【问题描述】:

我有一个 ASP.NET Core 3.1 Web Api 项目,它有 9 个 ApiController,每个控制器有多个端点。 每个控制器端点都与基于 Dapper ORM 的工作单元/存储库模式进行通信。

所有控制器的类头如下所示:

[Route("api/[controller]")]
[ApiController]
public class AuthController : ControllerBase
...

此 Api 与 Xamarin Android 项目通信以发送和接收数据。

自早春以来,此解决方案一直运行良好。 我对存储库层进行了一些更改以修改查询,并且代码可以正确编译。当我现在在 localhost 和 Web 主机服务器上运行应用程序时,从 Postman 测试的所有端点都返回 404 错误。 Nuget 包、appsettings.json 或 launchsettings.json 中没有任何变化。

我已经尝试解决这个问题两天了,真的需要一些帮助。 我已经查看了所有我可以找到的具有核心的相关帖子,但我没有看到与我的问题相匹配的帖子。

我还能提供哪些其他信息?

瑞恩

更新 1 下面是一个被调用来验证用户身份的示例方法: 这个网址会被称为“https://localhost:44365/api/auth/authenticate”

[HttpPost("authenticate")]
        public async Task<ActionResult<Login>> Authenticate([FromBody] Login login)
        {
            // login will come in from the device with basic auth
            string token = string.Empty;
            string username = login.UserName;
            string password = login.Password;
            int product = login.Product;
            string deviceName = login.DeviceName;
            try
            {
                bool isAuth = await _unitOfWork.Logins.GetAuthenticateUser(username, password, product);
                if(isAuth == false)
                {
                    return StatusCode(401);
                }

                //check for preference record
                bool exists = await _unitOfWork.Sessions.CheckForDevice(deviceName, product);
                if(!exists)
                {
                    // auto add the device
                    Prefs prefs = new Prefs();
                    SecurityUser user = await _unitOfWork.Logins.GetUserInfo(username, product);
                    prefs.deviceName = deviceName;
                    prefs.product = product;
                    prefs.facilityId = user.facID;
                    prefs.addedBy = username;
                    prefs.active = true;
                    prefs.timeout = "480";
                    int result = await _unitOfWork.Sessions.AddDevice(prefs, product);
                }

                Jwt j = new Jwt(_unitOfWork);
                try
                {
                    login.Token = j.CreateToken(username, deviceName, product);
                    SessionModel session = new SessionModel();
                    session.SessionStart = DateTime.Now;
                    login.SessionStart = session.SessionStart;
                    session.UserName = username;
                    session.Token = login.Token;
                    await _unitOfWork.Sessions.AddSession(session, product);
                }
                catch (Exception ex)
                {
                    //delete session if there is jwt error
                    await _unitOfWork.Sessions.DeleteAsyncByUserName(username, product);
                    var msg = $"Error message from create token - Inner Exception: {ex.InnerException} Exception Message: {ex.Message} Source: {ex.Source}";
                    login.Message = msg;
                    login.UserName = String.Empty;
                    login.Password = String.Empty;
                    //return login object with message 
                    return login;
                }
            }
            catch (Exception ex)
            {
                var msg = $"Error message from Header Auth decode - Inner Exception: {ex.InnerException} Exception Message: {ex.Message} Source: {ex.Source}";
                login.Message = msg;
                login.UserName = String.Empty;
                login.Password = String.Empty;
                return login;
            }
            //return login obj with token, msg, session datetime
            login.UserName = String.Empty;
            login.Password = String.Empty;
            return login;
        }

更新 2 我最大的挑战是弄清楚为什么控制器端点在 5 个月后突然返回 404 并且没有对控制器代码进行修改。

更新 3 启动配置方法

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            

            app.UseHttpsRedirection();

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });

        }

【问题讨论】:

  • 你能显示一个你调用的url的操作方法和例子吗?
  • 我添加了一个动作方法
  • [Route("api/[controller]")] 到 [Route("api/[controller]/[action]") 那么你的 url 将是 localhost:xxx/api/auth/authenticate ] 并确保邮递员设置为 POST 而不是 GET 有时会遗漏一些简单的事情。
  • 谢谢。我已经验证了你给出的所有分数。
  • 只是为了确认现在可以了吗?

标签: c# asp.net-core asp.net-web-api


【解决方案1】:

我在 appsettings.json 文件中发现,json 中有一个 C# 风格的注释。删除该评论似乎已经解决了问题。

【讨论】:

    【解决方案2】:

    我在 Azure 上托管的 WebAPI 也遇到了类似的问题。我对 NuGET 包进行了升级,并迁移到了 OData 版本 8。这突然使我的查询在过滤器中区分大小写。 假设我的数据库中有一个字段“State”,我用“https://localhost:5555/Adresses?$filter=state eq 'NY'”查询它然后给我一个错误,因为我查询的是 state 而不是为状态。 其他情况可能是,如果您在 Azure 上使用 API 管理,您的 Swagger 文件已损坏并且 API 管理中的链接不存在。 也许这对你有帮助。

    【讨论】:

    • 有趣。我将更新我的 Nuget 并检查我的招摇文件
    • 我强制恢复我的 nuget 包,但这并没有改变更多 404 错误的结果
    猜你喜欢
    • 2013-03-11
    • 1970-01-01
    • 2017-03-02
    • 2013-05-24
    • 2020-07-10
    • 1970-01-01
    • 2020-12-23
    • 2017-12-31
    • 2017-12-10
    相关资源
    最近更新 更多