ASP.NET Core WebAPI 回應 406 Not Acceptable

照著之前筆記 從 Empty 建立 ASP.NET Core Web API 從空專案開始建立 ASP.NET Core WebAPI ,過程中一切順利直到開始加入商業邏輯時卻出現意料外的錯誤,雖然事後覺得我應該要馬上聯想的問題原因,但事實上並沒有,紀錄一下加深印象

基本環境說明

  1. macOS Mojave 10.14.5
  2. .NET Core SDK 2.2.107 (.NET Core Runtime 2.2.5)
  3. NuGet package

    • Microsoft.AspNetCore.Mvc.FormattersJson 2.2.0

錯誤訊息

  1. 訊息內容

    406 Not Acceptable
    
  2. 錯誤截圖

    1error

問題發生原因

  1. 先檢視 kestrel log 的異常

    warn: Microsoft.AspNetCore.Mvc.Infrastructure.DefaultOutputFormatterSelector[1]
      No output formatter was found for content type '' to write the response.
    warn: Microsoft.AspNetCore.Mvc.Infrastructure.ObjectResultExecutor[1]
      No output formatter was found for content type '' to write the response.
    

    2kestrel

  2. 發現問題

    從 log 中我們可以看得出來,在 response 時並沒有任何的 content-type,而這個問題的源頭其實可以從 ASP.NET Core 中 AddMvc() 與 AddMvcCore() 的差別 中看得出來,因為使用 AddMvcCore() 而少了 builder.AddJsonFormatters();

如何解決問題

  1. 安裝需要的 formatter

    以 json 為例 Microsoft.AspNetCore.Mvc.FormattersJson

    • Package Manager

      Install-Package Microsoft.AspNetCore.Mvc.Formatters.Json
      
    • .NET CLI

      dotnet add package Microsoft.AspNetCore.Mvc.Formatters.Json --version 2.2.0
      
  2. 註冊 formatter

    調整 Startup.cs 中的 ConfigureServices 方法

     public void ConfigureServices(IServiceCollection services)
    {
            services.AddMvcCore().AddJsonFormatters();
    }
    

心得

原本以為我看過資料,遇到相關問題我應該可以快速想到問題發生的原因,想不到還是卡了一下XD

不過錯誤都已經發生了還是要想辦法改善,後來仔細檢討後發現,我之前 trace code 時是直接透過 GitHub 的 search in repository,結果就找到 master 的 code,而我應該要換到 tag 2.2.5 才是我正使用的版本呀 真是糟糕@@” 幸虧有筆記 才發現之前的錯誤

參考資訊

  1. 在 ASP.NET Core Web API 中格式化回應資料
  2. The difference between AddMvc() and AddMvcCore()
  3. 從 Empty 建立 ASP.NET Core Web API
  4. ASP.NET Core 中 AddMvc() 與 AddMvcCore() 的差別