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!
Enviar un nuevo comentario