I often see that writing to the HttpContext.Response.Body stream is a bad practice (or using PushStreamContent or StreamContent as part of a HttpMessageResponse) cause then you cannot change the HTTP status code if there is something wrong happening.
Is there any workaround to actually perform async writing to the output stream while being able to change HTTP status code in case the operation goes wrong?
Yes. Best practise is write Middleware. For example:
public class ErrorWrappingMiddleware
{
private readonly RequestDelegate next;
public ErrorWrappingMiddleware(RequestDelegate next)
{
this.next = next;
}
public async Task Invoke(HttpContext context)
{
try
{
await next.Invoke(context);
}
catch (Exception exception)
{
context.Response.StatusCode = 500;
await context.Response.WriteAsync(...); // change you response body if needed
}
}
}
and inject them to your pipeline
public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider serviceProvider)
{
...
app.UseMiddleware<ErrorWrappingMiddleware>();
...
}
And of course you can change your logic in your midleware as you wish, include change Response Code as you wish. Also, you can throw you own exception type, like MyOwnException, catch then in middleware and invoke you own logic wich related to your exception.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With