在 ASP.NET Core 3.1 中向您的 HTTP 400 错误请求添加一条消息

Add a message to your HTTP 400 Bad Request in ASP.NET Core 3.1

有没有一种方法可以将消息添加到 BadRequest 操作结果,并使该消息对外部客户端(例如 Postman)可见?我正在使用 ASP.NET Core 3.1.

我的部分代码包含在下面。我想说问题出在哪里——例如,正文中发送的 id 与从 URL 中获取的不一样。现在,我正在使用我制作的 Error 对象,其中包含错误代码和消息。但是当我发送请求时,这些在 Postman 中是不可见的。

public ActionResult PutColour(int id, Colour colour)
{
    if (id != colour.Id)
    {
        return BadRequest(new Error("IDNotTheSame","ID from URL is not the same as in the body."));
    }
}

您传递给 BadRequest 的内容被序列化并作为响应正文返回。如果 nothing 通过,唯一的解释是您在 Error 上没有任何可以序列化的 public 属性。例如,如果您有类似的内容:

public class Error
{
    public Error(string type, string description)
    {
        Type = type;
        Description = description;
    }

    public string Type { get; private set }
    public string Description { get; private set; }
}

然后,您会收到如下回复:

{
    "type": "IDNotTheSame",
    "description": "ID from URL is not the same as in the body."
}

不确定您的 Error class 目前在做什么。然而,这可能是不必要的,因为你可以使用 ModelState:

ModelState.AddModelError("Id", "ID from URL is not the same as in the body.");
return BadRequest(ModelState);

最后,大概应该说,这本来就是一个毫无意义的验证。您根本不应该使用模型发送 id(始终使用视图模型,而不是实体 class),即使您确实发送了它,您也可以简单地用 URL:

model.Id = id;

完成。没问题,您无需担心发回错误。

请按照以下步骤使用您的自定义 Class 显示错误请求。 在此处创建 class 的构造函数。并添加手册说明等等

步骤 1

添加自定义 class 并用 ValidationProblemDetails 继承此 class。之后通过传递 context.ModelState.

在基 class 构造函数下面初始化

public ValidationProblemDetails(ModelStateDictionary modelState)

这里是实现-

public class CustomBadRequest : ValidationProblemDetails
    {
        public CustomBadRequest(ActionContext context) : base(context.ModelState)
        {
            Detail = "add details here";
            Instance = "add extension here";
            Status = 400;
            Title = "add title here";
            Type = "add type here";
        }
    }

步骤 2

Startup.csConfigureServices 方法中添加此自定义错误请求 class。

public void ConfigureServices(IServiceCollection services)
        {
services.AddMvc().ConfigureApiBehaviorOptions(options =>
            {
                options.InvalidModelStateResponseFactory = context =>
                {
                    var problems = new CustomBadRequest(context);

                    return new BadRequestObjectResult(problems);
                };
            });
}

步骤 3

构建并运行。

如果出现任何错误的请求,您将看到如下输出-