Return Custom HTTP Status Code from WebAPI 2 endpoint
Solution 1
According to C# specification:
The set of values that an enum type can take on is not limited by its enum members. In particular, any value of the underlying type of an enum can be cast to the enum type and is a distinct valid value of that enum type
Therefore you can cast status code 422 to HttpStatusCode.
Example controller:
using System.Net;
using System.Net.Http;
using System.Web.Http;
namespace CompanyName.Controllers.Api
{
[RoutePrefix("services/noop")]
[AllowAnonymous]
public class NoOpController : ApiController
{
[Route]
[HttpGet]
public IHttpActionResult GetNoop()
{
return new System.Web.Http.Results.ResponseMessageResult(
Request.CreateErrorResponse(
(HttpStatusCode)422,
new HttpError("Something goes wrong")
)
);
}
}
}
Solution 2
return Content((HttpStatusCode) 422, whatEver);
credit is for: Return content with IHttpActionResult for non-OK response
and your code must be <= 999
and please ignore codes between 100 to 200.
Solution 3
I use this way simple and elegant.
public ActionResult Validate(User user)
{
return new HttpStatusCodeResult((HttpStatusCode)500,
"My custom internal server error.");
}
Then angular controller.
function errorCallBack(response) {
$scope.response = {
code: response.status,
text: response.statusText
}});
Hope it helps you.
Solution 4
Another simplified example:
public class MyController : ApiController
{
public IHttpActionResult Get()
{
HttpStatusCode codeNotDefined = (HttpStatusCode)422;
return Content(codeNotDefined, "message to be sent in response body");
}
}
Content
is a virtual method defined in abstract class ApiController
, the base of the controller. See the declaration as below:
protected internal virtual NegotiatedContentResult<T> Content<T>(HttpStatusCode statusCode, T value);
Solution 5
For this you may need to use an Action Filter Attribute. Nothing fancy. Just create a class and inherit it from ActionFilterAttribute
class in c#. Then override a method named OnActionExecuting
to implement this. Then just use this filter on the head of any controller. Following is a demo.
On the condition when you need to produce custom status code based message in ActionFilterAttribute
you can write in following way:
if (necessity_to_send_custom_code)
{
actionContext.Response = actionContext.Request.CreateResponse((HttpStatusCode)855, "This is custom error message for you");
}
Hope this helps.
Garrison Neely
You wanna do good, you try to do good, I think we did pretty good.
Updated on July 09, 2022Comments
-
Garrison Neely almost 2 years
I'm working on a service in WebAPI 2, and the endpoint currently returns an
IHttpActionResult
. I'd like to return a status code422
, but since it's not in theHttpStatusCode
enumeration, I'm at a loss as to how it would be sent, since all of the constructors require a parameter ofHttpStatusCode
As it stands now, I'm returning
BadResult(message)
, but returning a422
+ message would be more descriptive and useful for my clients. Any ideas?-
Jon Hanna about 10 yearsWhat happens if you return '(HttpStatusCode)422
. That's valid C# but I haven't used WebAPI 2, to be sure it won't be rejected. Otherwise one can certainly return
422 Unprocessable Entity` and other post-RFC 2616 statuses with ASP.NET or ASP.NET MVC, so maybe it's possible to drop down to that in WebAPI2, but again I don't know that so can't give a full answer. I do know that in MVC while setting justHttpResponse.StatusCode
will automatically set the correct status description for the RFC 2616 codes, you'll need to set "Unprocessable Entity" etc. yourself beyond those. -
Toan Nguyen about 10 yearsSorry, why do you want to use 422? It is not defined in the HTTP 1.1 specification!
-
Ergwun almost 10 years@ToanNguyen 422 is defined in HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV) (tools.ietf.org/html/rfc4918#section-11.2) See also: bennadel.com/blog/…
-
-
RyanJMcGowan over 7 yearsGreat solution. I refactored this and made a method on the controller that returns an IHttpActionResult. It is simplified to 'return Status(404,"Some error.").
-
Jonatan Dragon about 6 yearsThis solution is from System.Web.Mvc namespace, not System.Web.Http as expected
-
Dhouha BOUSSALEM over 3 yearsCan you explain more why we should ignore codes between 100 to 200 please?