ASP.NET Core 8 Web API 为 .NET 8 客户端返回状态代码 400

问题描述 投票:0回答:1

这让我抓狂,我不知道问题出在哪里。我有一个由 Web API 组成的项目和另一个调用它们的项目(客户端)。这两个项目都是使用 VS 2022、.NET 8 构建的。

这是我的认证功能:

    [AllowAnonymous]
    [HttpPost("Authenticate")]
    public async Task<UserLoginResponse> Authenticate(string lr)
    {
        UserLoginResponse resp = new UserLoginResponse { Success = false, ResultMessage = string.Empty, UserToken = "" };
        UserSignIn usi = default;

        if (string.IsNullOrEmpty(lr))
        {
            resp.Success = false;
            resp.ResultCodes = LoginResponseCodes.UserNamePasswordRequired;
            resp.UserToken = string.Empty;
            return resp;
        }

        try
        {
            usi = JsonConvert.DeserializeObject<UserSignIn>(lr);
        }
        catch (Exception ex) 
        {
            resp.Success = false;
            resp.ResultCodes = LoginResponseCodes.UserNamePasswordRequired;
            resp.UserToken = string.Empty;
            return resp;
        }

        if (string.IsNullOrEmpty(usi.Email) || string.IsNullOrEmpty(usi.Password))
        {
            resp.Success = false;
            resp.ResultMessage = "Valid User Name (email)/Password Required";
        }
        else
        {
            //resp = await _userService.Authenticate(usi);
            //if(resp == null)
            //{
            //    resp = new UserLoginResponse { Success = false, ResultMessage = "NULL Error", UserToken = "" };
            //}
        }

        return resp;
    }

这是我尝试过的众多客户端变体之一,所有这些都会导致

状态代码:400,原因短语:“错误请求”

代码:

    [AllowAnonymous]
    [HttpPost("Authenticate")]
    public async Task<UserLoginResponse> Authenticate(string lr)
    {
        UserLoginResponse resp = new UserLoginResponse { Success = false, ResultMessage = string.Empty, UserToken = "" };
        UserSignIn usi = default;

        if (string.IsNullOrEmpty(lr))
        {
            resp.Success = false;
            resp.ResultCodes = LoginResponseCodes.UserNamePasswordRequired;
            resp.UserToken = string.Empty;
            return resp;
        }

        try
        {
            usi = JsonConvert.DeserializeObject<UserSignIn>(lr);
        }
        catch (Exception ex) 
        {
            resp.Success = false;
            resp.ResultCodes = LoginResponseCodes.UserNamePasswordRequired;
            resp.UserToken = string.Empty;
            return resp;
        }

        if (string.IsNullOrEmpty(usi.Email) || string.IsNullOrEmpty(usi.Password))
        {
            resp.Success = false;
            resp.ResultMessage = "Valid User Name (email)/Password Required";
        }
        else
        {
            //resp = await _userService.Authenticate(usi);
            //if(resp == null)
            //{
            //    resp = new UserLoginResponse { Success = false, ResultMessage = "NULL Error", UserToken = "" };
            //}
        }

        return resp;
    }

任何地方都没有产生任何错误,至少我找不到。

如果我使用 Swagger 客户端测试我的 API 调用,它工作得很好。当我在 html 页面中使用以下 Javascript 时,它也可以正常工作。

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
    function CallWebApi() {
        var url = "https://localhost:7598/api/BlueUsers/Authenticate?lr=%7B%22Email%22%3A%22testemail%40gmail.com%22%2C%22Password%22%3A%22hjgtdsrsdes%22%7D";
        $.ajax({
            url: url,
            type: "POST",
            success: function (data) {
                console.log(data);
            },
            error: function (xhr, status, error) {
                console.log(xhr.responseText);
            }
        });
    }
    CallWebApi();

有人可以帮助我解决我在 .NET 客户端中缺少的内容和/或错误的操作吗?

谢谢你

c# asp.net-core-webapi .net-8.0 400-bad-request
1个回答
0
投票

您可以应用以下步骤来识别问题:

  1. 通过 appsettings.json 文件提高日志记录级别将允许您查看各种转换器、中间件和控制器正在执行的操作,最重要的是,它允许您比较 AJAX 代码段调用与 . NET 8 客户端。
  2. 就像评论中指出的那样,ASP.NET Core 应用程序的默认绑定逻辑将尝试从请求正文中绑定
    lr
    。您正在使用查询参数,因此添加 [FromQuery] 参数属性有助于框架确定该参数预计来自请求的查询部分。
  3. 在 .NET 8 客户端代码中,请务必检查查询字符串是否已正确编码。
© www.soinside.com 2019 - 2024. All rights reserved.