File: Formatters\HttpNoContentOutputFormatter.cs
Web Access
Project: src\src\Mvc\Mvc.Core\src\Microsoft.AspNetCore.Mvc.Core.csproj (Microsoft.AspNetCore.Mvc.Core)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using Microsoft.AspNetCore.Http;
 
namespace Microsoft.AspNetCore.Mvc.Formatters;
 
/// <summary>
/// Sets the status code to 204 if the content is null.
/// </summary>
public class HttpNoContentOutputFormatter : IOutputFormatter
{
    /// <summary>
    /// Indicates whether to select this formatter if the returned value from the action
    /// is null.
    /// </summary>
    public bool TreatNullValueAsNoContent { get; set; } = true;
 
    /// <inheritdoc />
    public bool CanWriteResult(OutputFormatterCanWriteContext context)
    {
        // ignore the contentType and just look at the content.
        // This formatter will be selected if the content is null.
        // We check for Task as a user can directly create an ObjectContentResult with the unwrapped type.
        if (context.ObjectType == typeof(void) || context.ObjectType == typeof(Task))
        {
            return true;
        }
 
        return TreatNullValueAsNoContent && context.Object == null;
    }
 
    /// <inheritdoc />
    public Task WriteAsync(OutputFormatterWriteContext context)
    {
        var response = context.HttpContext.Response;
 
        if (response.StatusCode == StatusCodes.Status200OK)
        {
            response.StatusCode = StatusCodes.Status204NoContent;
        }
 
        return Task.CompletedTask;
    }
}