How to return ModelState with forbidden web api status

We can return ModelStateusing BadRequestthe web api as follows:

return BadRequest(ModelState);

It provides the following output:

{
    "Message": "The request is invalid.",
    "ModelState": {
        "property": [
            "error"
        ]
    }
}

How can I return the same result with Forbiddenstatus?

I tried the following method:

return Content(HttpStatusCode.Forbidden, ModelState);

But it returns:

{
    "property": {
        "_errors": [
            {
                "<Exception>k__BackingField": null,
                "<ErrorMessage>k__BackingField": "error"
            }
        ],
        "<Value>k__BackingField": null
    }
}

Json session ModelSatealso does not return the same. How to use the serialization method used by the method BadRequest()for ModelStatewith other status codes?

+4
source share
1 answer

ExecuteAsync InvalidModelStateResult ( BadRequest() ApiController), ModelState.

, , , InvalidModelStateResult ExecuteAsync .

public class ModelStateResult : InvalidModelStateResult
{
    private readonly HttpStatusCode _status;

    public ModelStateResult(ModelStateDictionary modelState, ApiController controller, HttpStatusCode status) : base(modelState, controller)
    {
        _status = status;
    }

    public override Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
    {
        var response = base.ExecuteAsync(cancellationToken).Result;
        response.StatusCode = _status;
        return Task.FromResult(response);
    }
}

:

return new ModelStateResult(ModelState, this, HttpStatusCode.Forbidden);    //this refers to ApiController here

, , , - .

EDIT:

InvalidModelStateResult:

public class ModelStateResult : IHttpActionResult
{
    public HttpStatusCode Status { get; }
    public ModelStateDictionary ModelState { get; }
    public HttpRequestMessage Request { get; }

    public ModelStateResult(HttpStatusCode status, ModelStateDictionary modelState, HttpRequestMessage request)
    {
        Status = status;
        ModelState = modelState;
        Request = request;
    }

    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
    {
        var response = Request.CreateErrorResponse(Status, ModelState);
        return Task.FromResult(response);
    }
}
0

Source: https://habr.com/ru/post/1685010/


All Articles