[Web API]強制輸出JSON格式

[Web API]強制輸出JSON格式

由瀏覽器直接呼叫Web API時,會依照不同的瀏覽器而預設顯示不同的資料類型,以下方程式輸出string陣列為例

public IEnumerable<string> Get()
{
    return new string[] { "value1", "value2" };
}

實際在各瀏覽器中看到的結果

Google Chrome(版本 61.0.3163.100)

預設顯示XML格式

Internet Explorer(版本11.0.9600.18792)

預設下載json文件

Firefox(Developer Edition 版本57.03b)

預設XML格式

為了統一輸出的格式為JSON,先建立新的Class繼承System.Net.Http.Formatting.IContentNegotiator,設定輸出的Header Media Type為application/json

public class JsonContentNegotiator : IContentNegotiator
{
    private readonly JsonMediaTypeFormatter _jsonFormatter;

    public JsonContentNegotiator(JsonMediaTypeFormatter formatter)
    {
        _jsonFormatter = formatter;
    }
    public ContentNegotiationResult Negotiate(Type type, HttpRequestMessage request, IEnumerable<MediaTypeFormatter> formatters)
    {
        var result = new ContentNegotiationResult(_jsonFormatter, new MediaTypeHeaderValue("application/json"));
        return result;
    }
}

於WebApiConfig.cs的Register將IContentNegotiator換成新建立的JsonContentNegotiator


public static void Register(HttpConfiguration config)
{
    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "WebApi/{controller}/{action}/{id}",
        defaults: new { action = RouteParameter.Optional, id = RouteParameter.Optional }
    );
    var jsonFormatter = new JsonMediaTypeFormatter();
    config.Services.Replace(typeof(IContentNegotiator), new JsonContentNegotiator(jsonFormatter));
}

再一次於各瀏覽器呼叫,除了IE還是維持下載的方式,其餘瀏覽器可直接顯示JSON格式

Google Chrome(版本 61.0.3163.100)

Firefox(Developer Edition 版本57.03b)

參考資料

https://stackoverflow.com/questions/12629144/how-to-force-asp-net-web-api-to-always-return-json