Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get HTTP status code descriptions in ASP.Net Core

In previous versions of ASP.Net, we could retrieve the description of a HTTP status code in a few ways as shown here:

Get description for HTTP status code

Is there something similar to HttpWorkerRequest.GetStatusDescription in ASP.Net Core?

like image 252
Mister Epic Avatar asked May 04 '17 12:05

Mister Epic


People also ask

What is HttpStatusCode OK?

Equivalent to HTTP status 200. OK indicates that the request succeeded and that the requested information is in the response. This is the most common status code to receive.

What is OkObjectResult?

OkObjectResult. An ObjectResult, when executed, performs content negotiation, formats the entity body, and will produce a Status200OK response if negotiation and formatting succeed. public OkObjectResult OkObjectResult() { return new OkObjectResult(new { Message="Hello World !"

What is CreatedAtAction?

CreatedAtAction ExplainedThis method provides more support in generating URI for the Location header. As the name suggests, this method allows us to set Location URI of the newly created resource by specifying the name of an action where we can retrieve our resource.


Video Answer


4 Answers

You can use Microsoft.AspNetCore.WebUtilities.ReasonPhrases.GetReasonPhrase(int statusCode) (which can be got from the Microsoft.AspNetCore.WebUtilities package in NuGet if not already referenced in your project transiently by a package like Microsoft.AspNetCore.App):

using Microsoft.AspNetCore.WebUtilities;

int statusCode = 404;
string reasonPhrase = ReasonPhrases.GetReasonPhrase(statusCode);
like image 61
Martin Costello Avatar answered Oct 01 '22 23:10

Martin Costello


This is close enough for my needs:

var statusCode = httpContext.Response.StatusCode
var description = ((HttpStatusCode)statusCode).ToString(); // 404 -> "NotFound"
like image 23
Mister Epic Avatar answered Oct 01 '22 22:10

Mister Epic


Improving on the previous answer, you could split HttpStatusCode enum name with spaces, e.g.:

public string GetStatusReason(int statusCode)
{
    var key = ((HttpStatusCode) statusCode).ToString();

    return string.Concat(
        key.Select((c, i) =>
            char.IsUpper(c) && i > 0
                ? " " + c.ToString()
                : c.ToString()
        )
    );
}

Or if you prefer regular expressions:

public string GetStatusReason(int statusCode)
{
    var key = ((HttpStatusCode) statusCode).ToString();
    return Regex.Replace(key, "(\\B[A-Z])", " $1");
}

Also you can simplify it to just this:

public string GetStatusReason(HttpStatusCode statusCode)
{
    var key = statusCode.ToString();
    return Regex.Replace(key, "(\\B[A-Z])", " $1");
}

Looking at the enum key names they seem to be pretty reasonably named so most, if not all, status codes should yield acceptable reason messages.

like image 29
Andris Avatar answered Oct 01 '22 21:10

Andris


Instead of using a NuGet or splicing a string, here's a simple implementation. These descriptions should match the source of HttpWorkerRequest.

        /// <summary>
        /// Descriptions for Http Status Code
        /// </summary>
        /// <param name="code"></param>
        /// <returns></returns>
        public static string GetHttpStatusDescription(int code)
        {
            switch (code)
            {
                case 100: return "Continue";
                case 101: return "Switching Protocols";
                case 102: return "Processing";
                case 200: return "OK";
                case 201: return "Created";
                case 202: return "Accepted";
                case 203: return "Non-Authoritative Information";
                case 204: return "No Content";
                case 205: return "Reset Content";
                case 206: return "Partial Content";
                case 207: return "Multi-Status";
                case 300: return "Multiple Choices";
                case 301: return "Moved Permanently";
                case 302: return "Found";
                case 303: return "See Other";
                case 304: return "Not Modified";
                case 305: return "Use Proxy";
                case 307: return "Temporary Redirect";
                case 400: return "Bad Request";
                case 401: return "Unauthorized";
                case 402: return "Payment Required";
                case 403: return "Forbidden";
                case 404: return "Not Found";
                case 405: return "Method Not Allowed";
                case 406: return "Not Acceptable";
                case 407: return "Proxy Authentication Required";
                case 408: return "Request Timeout";
                case 409: return "Conflict";
                case 410: return "Gone";
                case 411: return "Length Required";
                case 412: return "Precondition Failed";
                case 413: return "Request Entity Too Large";
                case 414: return "Request-Uri Too Long";
                case 415: return "Unsupported Media Type";
                case 416: return "Requested Range Not Satisfiable";
                case 417: return "Expectation Failed";
                case 422: return "Unprocessable Entity";
                case 423: return "Locked";
                case 424: return "Failed Dependency";
                case 500: return "Internal Server Error";
                case 501: return "Not Implemented";
                case 502: return "Bad Gateway";
                case 503: return "Service Unavailable";
                case 504: return "Gateway Timeout";
                case 505: return "Http Version Not Supported";
                case 507: return "Insufficient Storage";
            }
            return "";
        }
like image 3
refactorthis Avatar answered Oct 01 '22 22:10

refactorthis