When building a web server in ASP.NET Core, the APIs that deal with status codes are int
based, there are multiple ways to express a status code in your code, in this post I will share my favourite.
// Stop doing this:
context.Response.StatusCode = (int) HttpStatusCode.PreconditionFailed;
A System.Net.HttpStatusCode
enum
This is the enum we've been using in .NET for a while, it's alright and it still makes sense to use when we are dealing with HttpClient
, as it's the type the response type uses there. However, when you read it you may find yourself having to translate it back to the status code number, I find myself forgetting if "Bad Gateway" is 502 or 503 for example.
Finally, when we are dealing with ASP.NET Core, the status code type used is int
, so we find ourselves having to cast between the two types, not ideal.
An int
As ASP.NET Core wants an int
for status code, we could just express the status code as int
literals, however you have the reverse problem as you do with HttpStatusCode
—what was the meaning of that number again?
Use Microsoft.AspNetCore.Http.StatusCodes
This is a static class containing int
constants for every status code, what is great about these is that they include both the number and the name of the status code, so we get the best of both worlds. For example: StatusCodes.Status412PreconditionFailed
.
using static
With Microsoft.AspNetCore.Http.StatusCodes
above, if we bring it into the namespace with using Microsoft.AspNetCore.Http
, then we end up repeating ourselves when using it, for example StatusCodes.Status412PreconditionFailed
. Since C# 6, we've been able to open static classes, which makes this much nicer!
// Not for me
context.Response.StatusCode = (int) HttpStatusCode.PreconditionFailed; // What number is it?
context.Response.StatusCode = 412; // What meaning is it?
context.Response.StatusCode = StatusCodes.Status412PreconditionFailed; // Too many duplicated words duplicated
// Perfect ♥
using static Microsoft.AspNetCore.Http.StatusCodes;
// ...
context.Response.StatusCode = Status412PreconditionFailed;
Bonus: The F# Version
Since F# 4.7, there is a preview feature to open static classes, just like in C#. Here is an example setting the status code using Giraffe:
open Microsoft.AspNetCore.Http.StatusCodes
let someHttpHandler : HttpHandler =
setStatusCode Status412PreconditionFailed
Wrapping up
It's a small detail, but I think it helps keep code noise-free and as readable as possible.
Comments