Return Mvc.JsonResult plus set Response.StatusCode Return Mvc.JsonResult plus set Response.StatusCode json json

Return Mvc.JsonResult plus set Response.StatusCode


I had this exact same problem; in order to make sure that the correct answer is not buried in the comments (as it was for me), I want to reiterate @Sprockincat's comment:

For me at least, it was indeed an issue with IIS Custom errors, and can be solved with:

Response.TrySkipIisCustomErrors = true;

@Sprockincat - you should get credit for this. I'm just making it more visible because it's such a subtle fix to a problem that is quite difficult to diagnose.


I've created a subclass of JsonResult that allows you to specify the HttpStatusCode.

public class JsonResultWithHttpStatusCode : JsonResult{    private int _statusCode;    private string _statusDescription;    public JsonResultWithHttpStatusCode(object data, HttpStatusCode status)     {        var code = Convert.ToInt32(status);        var description = HttpWorkerRequest.GetStatusDescription(code);        Init(data, code, description);    }    public JsonResultWithHttpStatusCode(object data, int code, string description)    {        Init(data, code, description);    }    private void Init(object data, int code, string description)    {        Data = data;        _statusCode = code;        _statusDescription = description;    }    public override void ExecuteResult(ControllerContext context)    {        context.HttpContext.Response.StatusCode = _statusCode;        context.HttpContext.Response.StatusDescription = _statusDescription;        base.ExecuteResult(context);    }}

Then you can return this as your result and the status code will get set on the response. You can also test the status code on the result in your tests.


For anyone looking for this - in ASP.NET Core you can set the StatusCode property of JsonResult.

https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.mvc.jsonresult.statuscode