26

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?

1
  • Do you have a HttpResponseMessage? You can use the ReasonPhrase property of it, it seems. It does use HttpStatusDescription internally, but sadly that class is not public. Commented Aug 27, 2018 at 10:06

6 Answers 6

49

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);
Sign up to request clarification or add additional context in comments.

6 Comments

What is the value of reasonPhrase?
In this case for 404 it would be "Not Found". For 405 it would be "Method Not Allowed" etc.
It might be worth pointing out that this method is in a NuGet package, and is not part of Net Core itself.
It's part of asp.net 5.0, no need for Nuget.
Microsoft.AspNetCore.WebUtilities has been marked as deprecated.
|
15

This is close enough for my needs:

var statusCode = httpContext.Response.StatusCode
var description = ((HttpStatusCode)statusCode).ToString(); // 404 -> "NotFound"

3 Comments

Not a real solution - you could have done this in ASP.Net, it doesn't give you a user-friendly message.
@ChrisPeacock And that is why I didn't select this as the answer. If someone posts something better, then I will certainly accept it.
I've resorted to copying the code from ASP.Net's HttpWorkerRequest.
6

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 "";
        }

Comments

4

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.

1 Comment

The only issue with this is status code 200 (OK), which gets converted to "O K" (ie. the characters O and K, with a space inbetween).
1

You can do

int code = 404;
string statusText = Enum.GetName(typeof(HttpStatusCode), code);

1 Comment

This would return "NotFound"; the expected result would be "Not Found".
0

if response is HttpResponseMessage from HttpClient...

ReasonPhrases.GetReasonPhrase((int)response.StatusCode))

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.