Saltar al contenido

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript... y lo que venga ;)

17 años online

el blog de José M. Aguilar

Inicio El autor Contactar

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web
ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript...

¡Microsoft MVP!
martes, 12 de julio de 2022
ASP.NET Core

Como sabemos, la respuesta a todas las peticiones HTTP comienzan por un código de estado que indica el resultado de la operación. Ahí encontramos desde los códigos más célebres, como HTTP 200 (Ok) o HTTP 404 (Not found) hasta otras joyas menos conocidas como HTTP 429 (Too many requests) o HTTP 418 (I'm a teapot).

Sin embargo, pocas veces nos fijamos en el texto que acompaña al código de respuesta, denominado reason phrase (en los ejemplos anteriores va entre paréntesis, como "Ok" o "Not found"). Según se define en la RFC 7230 sección 3.1.2, la reason phrase...

"... existe con el único propósito de proporcionar una descripción textual asociada con el código de estado numérico, principalmente como una deferencia a los protocolos iniciales de Internet, que eran utilizados frecuentemente por clientes de texto interactivos. Un cliente DEBERÍA ignorar su contenido"

Por tanto, dado que se trata de un texto arbitrario y puramente informativo, deberíamos poder modificarlo a nuestro antojo, más allá de los textos estándar proporcionados por el framework.

En aplicaciones ASP.NET 4.x para .NET Framework, esto se podía hacer de forma sencilla estableciendo la propiedad ReasonPhrase del objeto Response del contexto HTTP:

// ASP.NET "clásico":
httpContext.Response.StatusCode = 200;
httpContext.Response.ReasonPhrase = "Done";

Sin embargo, si lleváis algún tiempo trabajando con ASP.NET Core, sabréis que no es posible, o al menos de forma tan directa, pues el objeto Response no expone ninguna propiedad con este fin:

// ASP.NET Core:
app.MapGet("/", (HttpResponse response) =>
{
    response.StatusCode = 200;
    response.ReasonPhrase = "Done"; // Error: no existe la propiedad
});

Sin embargo, podemos encontrar una propiedad idéntica en el objeto IHttpResponseFeature disponible en la colección de features del contexto HTTP de la petición. Por tanto, basta con acceder a esta característica a través del objeto HttpContext que podemos inyectar como parámetro:

app.MapGet("/", (HttpContext ctx) =>
{
    var httpResponseFeature = ctx.Features.Get<IHttpResponseFeature>();
    if (httpResponseFeature != null)
    {
        httpResponseFeature.StatusCode = 200;
        httpResponseFeature.ReasonPhrase = "Done";
    }
});

De forma muy similar podríamos hacerlo también desde una acción MVC, pues la clase Controller ya nos da acceso a la instancia de HttpContext actual:

public class HomeController: Controller
{
    public IActionResult Index()
    {
        var httpResponseFeature = HttpContext.Features.Get<IHttpResponseFeature>();
        if (httpResponseFeature != null)
        {
            httpResponseFeature.ReasonPhrase = "View returned!";
        }
        return View();
    }
}

Publicado en Variable not found.

Aún no hay comentarios, ¡sé el primero!