مدیریت خروجی نال از اکشن متدهای برنامه‌های ASP.NET Core
اندازه‌ی قلم متن
تخمین مدت زمان مطالعه‌ی مطلب: دو دقیقه

فرض کنید اکشن متد Web API شما قرار است اطلاعات رکوردی را بازگشت دهد:
using Microsoft.AspNetCore.Mvc;

namespace Core3xWebApi.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class HomeController : ControllerBase
    {
        [HttpGet]
        public ActionResult<string> Get()
        {
            return null;
        }
    }
}
و در این حالت خاص، خروجی کوئری مدنظر، نال است. اگر کلاینت سعی کند این اطلاعات را دریافت نماید، با تصویر/خروجی زیر مواجه خواهد شد:


همانطور که مشاهده می‌کنید، هیچ خروجی تولید نشده و تنها به تنظیم status-code مساوی 204 که به معنای no content است، اکتفا کرده‌است.


چرا از کشن متدهای ASP.NET Core نمی‌توان خروجی نال گرفت؟

فرمت خروجی اکشن متدها در ASP.NET Core بر اساس output formatter‌های متفاوتی مانند JSON ،XML و غیره، تعیین می‌شود. اما زمانیکه به نال می‌رسد، از یک output formatter خاص به نام HttpNoContentOutputFormatter کمک می‌گیرد. کار آن تبدیل null، به خروجی مخصوصی است که توضیح داده شد. به این معنا که هیچگاه خروجی نال برنامه، برای مثال به نحو متداولی تبدیل به یک خروجی استاندارد JSON نمی‌شود و این مساله برای Http Client‌های مختلفی که منتظر یک خروجی استاندارد هستند (مانند انواع برنامه‌های تک صفحه‌ای وب)، عموما مساله ساز است؛ چون هر status-code دیگری بجز 200 را به صورت بروز یک خطا تفسیر می‌کنند که در حالت فوق، فقط به معنای نبود اطلاعات است و نه بروز خطایی.


چگونه خروجی نال را به همان شکلی که هست بازگشت دهیم؟

HttpNoContentOutputFormatter به همراه خاصیت TreatNullValueAsNoContent نیز هست که اگر در ابتدای تنظیمات برنامه به false تنظیم شود، دیگر مقادیر نال را به خروجی no content تبدیل نمی‌کند:
namespace Core3xWebApi
{
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers(options =>
            {
                // remove formatter that turns nulls into 204 - No Content responses
                // this formatter breaks SPA's Http response JSON parsing
                options.OutputFormatters.RemoveType<HttpNoContentOutputFormatter>();
                options.OutputFormatters.Insert(0, new HttpNoContentOutputFormatter
                {
                    TreatNullValueAsNoContent = false
                });
            });
        }
پس از این تغییر، اگر برنامه‌ی سمت کلاینت، سعی در دریافت اطلاعاتی از API فوق کند، اینبار یک خروجی استاندارد JSON را که در آن null درج شده‌است، دریافت خواهد کرد؛ به همراه status-code مساوی 200 که در سمت کلاینت، به یک خطا نگاشت نخواهد شد (اگر کوئری ما خروجی ندارد، دلیل بر بروز خطایی نبوده؛ فقط اطلاعاتی برای نمایش نیست):