Aracılığıyla paylaş


ASP.NET Core Web API'sinde yanıt verilerini biçimlendirme

ASP.NET Core MVC, belirtilen biçimleri kullanarak veya istemcinin isteğine yanıt olarak yanıt verilerini biçimlendirmeyi destekler.

Biçime Özgü Eylem Sonuçları

Bazı eylem sonuç türleri ve JsonResultgibi ContentResult belirli bir biçime özeldir. Eylemler, istemcinin farklı bir biçim isteğini yoksayarak her zaman belirtilen biçimi kullanan sonuçlar döndürebilir. Örneğin, JsonResult JSON biçimli veri döndürürken, ContentResult düz metin biçimli dize verisi döndürür.

Belirli bir türü döndürmek için eylem gerekmez. ASP.NET Core herhangi bir nesne dönüş değerini destekler. Tür olmayan IActionResult nesneleri döndüren eylemlerden elde edilen sonuçlar, uygun IOutputFormatter uygulama kullanılarak serileştirilir. Daha fazla bilgi için bkz. ASP.NET Core web API'sinde Denetleyici eylem dönüş türleri.

Varsayılan olarak, yerleşik yardımcı yöntemi ControllerBase.Ok JSON biçimli verileri döndürür:

[HttpGet]
public IActionResult Get() =>
    Ok(_todoItemStore.GetList());

Örnek kod, yapılacaklar öğelerinin listesini döndürür. Önceki kod ile F12 tarayıcı geliştirici araçlarını veya http-repl'i kullanarak şunlar görüntülenir:

  • Content-Type içeren yanıt üstbilgisi:application/json; charset=utf-8.
  • İstek üst bilgileri. Örneğin, Accept üst bilgi. Önceki kod tarafından Accept başlığı yoksayılır.

Düz metin biçimlendirilmiş verileri döndürmek için ContentResult ve Content yardımcısını kullanın.

[HttpGet("Version")]
public ContentResult GetVersion() =>
    Content("v1.0.0");

Önceki kodda döndürülen text/plain değeridir Content-Type.

Birden çok dönüş türüne sahip eylemler için IActionResult döndürülmelidir. Örneğin, işlemin sonucuna göre farklı HTTP durum kodları döndürürken.

İçerik anlaşması

İstemci bir Accept üst bilgisi belirttiğinde içerik anlaşması gerçekleşir. ASP.NET Core tarafından kullanılan varsayılan biçim JSON'dır. İçerik anlaşması şu şekildedir:

  • ObjectResult tarafından uygulanır.
  • Yardımcı yöntemlerden döndürülen durum koduna özgü eylem sonuçlarında yerleşik olarak bulunur. Eylem sonuçları yardımcı yöntemleri ObjectResult'ye dayalı olarak temel alır.

Bir model türü döndürüldüğünde, dönüş türü ObjectResult'dir.

Aşağıdaki eylem yöntemi ve OkNotFound yardımcı yöntemlerini kullanır:

[HttpGet("{id:long}")]
public IActionResult GetById(long id)
{
    var todo = _todoItemStore.GetById(id);

    if (todo is null)
    {
        return NotFound();
    }

    return Ok(todo);
}

Varsayılan olarak, ASP.NET Core aşağıdaki medya türlerini destekler:

  • application/json
  • text/json
  • text/plain

Fiddler veya curl gibi araçlar, dönüş biçimini belirtmek için istek üst bilgisini ayarlayabilirAccept. Sunucunun desteklediği bir tür, Accept üst bilgisinde bulunduğunda, bu tür döndürülür. Sonraki bölümde ek biçimlendiricilerin nasıl ekleneceği gösterilmektedir.

Denetleyici eylemleri POCO'ları (Düz Eski CLR Nesneleri) döndürebilir. PoCO döndürülürken çalışma zamanı otomatik olarak nesneyi sarmalayan bir ObjectResult oluşturur. İstemci, biçimlendirilmiş serileştirilmiş nesneyi alır. Döndürülen nesne ise null, bir 204 No Content yanıt döndürülür.

Aşağıdaki örnek bir nesne türü döndürür:

[HttpGet("{id:long}")]
public TodoItem? GetById(long id) =>
    _todoItemStore.GetById(id);

Önceki kodda geçerli bir yapılacaklar öğesi için istek bir 200 OK yanıt döndürür. Geçersiz bir yapılacaklar öğesi isteği bir 204 No Content yanıt döndürür.

Accept üst bilgisi

İçerik anlaşması , istekte bir Accept üst bilgi görüntülendiğinde gerçekleşir. Bir istek "accept" başlığı içerdiğinde ASP.NET Core:

  • Kabul üst bilgisindeki medya türlerini tercih sırasına göre numaralandırır.
  • Belirtilen biçimlerden birinde yanıt oluşturabilen bir biçimlendirici bulmaya çalışır.

İstemcinin isteğini karşılayan bir biçimlendirici bulunamazsa ASP.NET Core:

İstenen biçim için yapılandırılan bir biçimlendirici yoksa, nesneyi biçimlendirebilen ilk biçimlendirici kullanılır. İstekte üst Accept bilgi görünmüyorsa:

  • Nesneyi işleyebilen ilk biçimlendirici, yanıtı seri hale getirmek için kullanılır.
  • Herhangi bir pazarlık yok. Sunucu hangi biçimin döndürüleceği konusunda karara varıyor.

Accept üst bilgisi */* içeriyorsa, RespectBrowserAcceptHeader true olarak ayarlanmamışsa MvcOptions üst bilgi göz ardı edilir.

Tarayıcılar ve içerik anlaşması

Tipik API istemcilerinden farklı olarak, web tarayıcıları üst bilgileri Accept sağlar. Web tarayıcıları joker karakterler de dahil olmak üzere birçok biçim belirtir. Varsayılan olarak, çerçeve isteğin bir tarayıcıdan geldiğini algıladığında:

  • Başlık Accept yoksayılır.
  • İçerik, aksi yapılandırılmadığı sürece yanıt türünü işleyebilen ilk kayıtlı çıkış biçimlendiricisi kullanılarak döndürülür.

Bu yaklaşım, API'leri kullanırken tarayıcılar arasında daha tutarlı bir deneyim sağlar.

Bir uygulamayı tarayıcının kabul ettiği üstbilgileri dikkate alacak şekilde yapılandırmak için RespectBrowserAcceptHeader özelliğini true olarak ayarlayın:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers(options =>
{
    options.RespectBrowserAcceptHeader = true;
});

Biçimlendiricileri yapılandırma

Ek biçimleri desteklemesi gereken uygulamalar uygun NuGet paketlerini ekleyebilir ve desteği yapılandırabilir. Giriş ve çıkış için ayrı biçimlendiriciler vardır. Giriş biçimlendiricileri Model Bağlama tarafından kullanılır. Çıkış biçimlendiricileri yanıtları biçimlendirmek için kullanılır. Özel biçimlendirici oluşturma hakkında bilgi için bkz . Özel Biçimlendiriciler.

XML biçimi desteği ekleme

XmlSerializer kullanılarak uygulanan XML biçimlendiricilerini yapılandırmak için AddXmlSerializerFormatters çağrısını yaparak:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers()
    .AddXmlSerializerFormatters();

Yukarıdaki kodu kullanırken denetleyici yöntemleri, isteğin Accept üst bilgisine göre uygun biçimi döndürür.

System.Text.Json tabanlı biçimlendiricileri yapılandırma

Tabanlı biçimlendiricilerin System.Text.Json özelliklerini yapılandırmak için Microsoft.AspNetCore.Mvc.JsonOptions.JsonSerializerOptions kullanın. Aşağıdaki vurgulanmış kod varsayılan camelCase biçimlendirmesi yerine PascalCase biçimlendirmesini yapılandırıyor:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers()
    .AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.PropertyNamingPolicy = null;
    });

Aşağıdaki eylem yöntemi, bir ProblemDetails yanıtı oluşturmak için ControllerBase.Problem çağrısı yapar:

[HttpGet("Error")]
public IActionResult GetError() =>
    Problem("Something went wrong.");

ProblemDetails Uygulama biçimi PascalCase olarak belirlese bile yanıt her zaman camelCase şeklindedir. ProblemDetails, küçük harf belirten RFC 7807'yi izler.

Belirli eylemler için çıkış serileştirme seçeneklerini yapılandırmak için kullanın JsonResult. Örneğin:

[HttpGet]
public IActionResult Get() =>
    new JsonResult(
        _todoItemStore.GetList(),
        new JsonSerializerOptions
        {
            PropertyNamingPolicy = null
        });

Newtonsoft.Json tabanlı JSON formatı desteği ekleme

Varsayılan JSON biçimlendiricileri kullanır System.Text.Json. Newtonsoft.Json tabanlı biçimlendiricileri kullanmak için Microsoft.AspNetCore.Mvc.NewtonsoftJson NuGet paketini yükleyin ve Program.cs içinde yapılandırın.

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers()
    .AddNewtonsoftJson();

Yukarıdaki kodda, AddNewtonsoftJson çağrısı, aşağıdaki Web API, MVC ve Razor Pages özelliklerini, Newtonsoft.Json şekilde kullanacak şekilde yapılandırıyor.

Bazı özellikler System.Text.Json tabanlı biçimlendiricilerle düzgün çalışmayabilir ve Newtonsoft.Json tabanlı biçimlendiricilere başvuru gerektirebilir. Uygulama şu Newtonsoft.Json tabanlı biçimlendiriciler kullanmaya devam edin:

  • Öznitelikleri Newtonsoft.Json kullanır. Örneğin, [JsonProperty] veya [JsonIgnore].
  • Serileştirme ayarlarını özelleştirir.
  • Sağlayan özelliklere Newtonsoft.Json dayanır.

Newtonsoft.Json tabanlı biçimlendiriciler için özellikleri yapılandırmak amacıyla SerializerSettings kullanın:

builder.Services.AddControllers()
    .AddNewtonsoftJson(options =>
    {
        options.SerializerSettings.ContractResolver = new DefaultContractResolver();
    });

Belirli eylemler için çıkış serileştirme seçeneklerini yapılandırmak için kullanın JsonResult. Örneğin:

[HttpGet]
public IActionResult GetNewtonsoftJson() =>
    new JsonResult(
        _todoItemStore.GetList(),
        new JsonSerializerSettings
        {
            ContractResolver = new DefaultContractResolver()
        });

Biçim belirtme

Yanıt biçimlerini kısıtlamak için filtreyi [Produces] uygulayın. Çoğu Filtre gibi, eylemde, [Produces] kontrolörde veya genel kapsamda uygulanabilir.

[ApiController]
[Route("api/[controller]")]
[Produces("application/json")]
public class TodoItemsController : ControllerBase

Yukarıdaki [Produces] filtre:

  • Denetleyici sınıfındaki tüm eylemlerin, POCO'lar (Düz Eski CLR Nesneleri) veya ObjectResult ve türetilmiş türleri için JSON biçimli yanıtlar döndürmesini sağlar.
  • Diğer biçimlendiriciler yapılandırılmış olsa ve istemci farklı bir biçim belirtse bile JSON biçimli yanıtlar döndürür.

Daha fazla bilgi için bkz . Filtreler.

Özel durum biçimlendiricileri

Bazı özel durumlar yerleşik biçimlendiriciler kullanılarak uygulanır. Varsayılan olarak, string dönüş türleri metin/düz olarak biçimlendirilir (başlık aracılığıyla talep edildiğinde metin/html Accept). Bu davranış StringOutputFormatter kaldırılarak silinebilir. Biçimlendiriciler Program.cs içinde kaldırılır. Model nesnesi dönüş türüne sahip eylemler, null döndürülürken 204 No Content döndürür. Bu davranış, HttpNoContentOutputFormatter kaldırılarak silinebilir. Aşağıdaki kod StringOutputFormatter ve HttpNoContentOutputFormatter öğelerini kaldırır.

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers(options =>
{
    // using Microsoft.AspNetCore.Mvc.Formatters;
    options.OutputFormatters.RemoveType<StringOutputFormatter>();
    options.OutputFormatters.RemoveType<HttpNoContentOutputFormatter>();
});

StringOutputFormatter olmadan, yerleşik olarak JSON biçimlendirici string döndürme türlerini formatlar. Yerleşik JSON biçimlendiricisi kaldırılırsa ve xml biçimlendirici kullanılabilir durumdaysa, XML biçimlendirici biçimleri string türleri döndürür. Aksi takdirde, string dönüş türleri 406 Not Acceptable döndürür.

HttpNoContentOutputFormatter olmadan, null nesneler yapılandırılan biçimlendirici kullanılarak biçimlendirilir. Örneğin:

  • JSON biçimlendiricisi gövdesine null sahip bir yanıt döndürür.
  • XML biçimlendirici, öznitelik xsi:nil="true" kümesine sahip boş bir XML öğesi döndürür.

Yanıt biçimi URL eşlemeleri

İstemciler URL'nin bir parçası olarak belirli bir biçim isteyebilir, örneğin:

  • Sorgu dizesinde veya yolun bir bölümünde.
  • .xml veya .json gibi biçime özgü bir dosya uzantısı kullanarak.

İstek yolundan haritalama, API'nin kullandığı rotada belirtilmelidir. Örneğin:

[ApiController]
[Route("api/[controller]")]
[FormatFilter]
public class TodoItemsController : ControllerBase
{
    private readonly TodoItemStore _todoItemStore;

    public TodoItemsController(TodoItemStore todoItemStore) =>
        _todoItemStore = todoItemStore;

    [HttpGet("{id:long}.{format?}")]
    public TodoItem? GetById(long id) =>
        _todoItemStore.GetById(id);

Yukarıdaki yol, isteğe bağlı bir dosya uzantısı kullanılarak istenen biçimin belirtilmesine izin verir. [FormatFilter] özniteliği içindeki RouteData biçim değerinin varlığını denetler ve yanıt oluşturulduğunda yanıt biçimini uygun biçimlendiriciyle eşler.

Route Formatter
/api/todoitems/5 Varsayılan çıkış biçimlendiricisi
/api/todoitems/5.json JSON biçimlendiricisi (yapılandırıldıysa)
/api/todoitems/5.xml XML biçimlendiricisi (yapılandırıldıysa)

Polimorfik deserializasyon

Yerleşik özellikler sınırlı bir polimorfik serileştirme kapasitesi sağlar fakat seri durumdan çıkarma desteği sunmaz. Seri durumdan çıkarma için özel bir dönüştürücü gerekir. Tam bir polimorfik seri durumdan çıkarma örneği için bkz. Polimorfik seri durumdan çıkarma.

Ek kaynaklar

ASP.NET Core MVC, yanıt verilerini biçimlendirme desteğine sahiptir. Yanıt verileri belirli biçimler kullanılarak veya istemci tarafından istenen biçime yanıt olarak biçimlendirilebilir.

Örnek kodu görüntüleme veya indirme (indirme)

Biçime Özgü Eylem Sonuçları

Bazı eylem sonuç türleri ve JsonResultgibi ContentResult belirli bir biçime özeldir. Eylemler, istemci tercihlerinden bağımsız olarak belirli bir biçimde biçimlendirilmiş sonuçlar döndürebilir. Örneğin, döndürme JsonResult JSON biçimli verileri döndürür. ContentResult veya bir dize döndürmek, düz metin biçimlendirilmiş dize verilerini döndürür.

Belirli bir türü döndürmek için eylem gerekmez. ASP.NET Core herhangi bir nesne dönüş değerini destekler. Tür olmayan IActionResult nesneleri döndüren eylemlerden elde edilen sonuçlar, uygun IOutputFormatter uygulama kullanılarak serileştirilir. Daha fazla bilgi için bkz ASP.NET Core web API'sinde denetleyici eylemi dönüş türleri.

Yerleşik yardımcı yöntemi Ok JSON biçimli verileri döndürür:

// GET: api/authors
[HttpGet]
public ActionResult Get()
{
    return Ok(_authors.List());
}

Örnek indirme, yazarların listesini döndürür. Önceki kodla F12 tarayıcı geliştirici araçlarını veya http-repl'i kullanma:

  • Yanıt üst bilgisi "content-type:" içerir ve görüntülenir.
  • İstek üst bilgileri görüntülenir. Örneğin, Accept üst bilgi. Önceki kod tarafından Accept başlığı yoksayılır.

Düz metin biçimlendirilmiş verileri döndürmek için ContentResult ve Content yardımcısını kullanın.

// GET api/authors/about
[HttpGet("About")]
public ContentResult About()
{
    return Content("An API listing authors of docs.asp.net.");
}

Önceki kodda döndürülen text/plain değeridir Content-Type. Dize döndürüldükten sonra Content-Type of text/plain:

// GET api/authors/version
[HttpGet("version")]
public string Version()
{
    return "Version 1.0.0";
}

Birden çok dönüş türüne sahip eylemler için IActionResult döndürülmelidir. Örneğin, gerçekleştirilen işlemlerin sonucuna göre farklı HTTP durum kodları döndürme.

İçerik anlaşması

İstemci bir Accept üst bilgisi belirttiğinde içerik anlaşması gerçekleşir. ASP.NET Core tarafından kullanılan varsayılan biçim JSON'dır. İçerik anlaşması şu şekildedir:

  • ObjectResult tarafından uygulanır.
  • Yardımcı yöntemlerden döndürülen durum koduna özgü eylem sonuçlarında yerleşik olarak bulunur. Eylem sonuçları yardımcı yöntemleri ObjectResult'ye dayalı olarak temel alır.

Bir model türü döndürüldüğünde, dönüş türü ObjectResult'dir.

Aşağıdaki eylem yöntemi ve OkNotFound yardımcı yöntemlerini kullanır:

// GET: api/authors/search?namelike=th
[HttpGet("Search")]
public IActionResult Search(string namelike)
{
    var result = _authors.GetByNameSubstring(namelike);
    if (!result.Any())
    {
        return NotFound(namelike);
    }
    return Ok(result);
}

varsayılan olarak, ASP.NET Core , application/jsonve text/json medya türlerini desteklertext/plain. Araçlar, örneğin Fiddler veya http-repl, istek başlığını ayarlayarak dönüş biçimini belirleyebilir. Sunucunun desteklediği bir tür, Accept üst bilgisinde bulunduğunda, bu tür döndürülür. Sonraki bölümde ek biçimlendiricilerin nasıl ekleneceği gösterilmektedir.

Denetleyici eylemleri POCO'ları (Düz Eski CLR Nesneleri) döndürebilir. PoCO döndürülürken çalışma zamanı otomatik olarak nesneyi sarmalayan bir ObjectResult oluşturur. İstemci, biçimlendirilmiş serileştirilmiş nesneyi alır. Döndürülen nesne ise null, bir 204 No Content yanıt döndürülür.

Nesne türü döndürme

// GET api/authors/RickAndMSFT
[HttpGet("{alias}")]
public Author Get(string alias)
{
    return _authors.GetByAlias(alias);
}

Önceki kodda geçerli bir yazar diğer adı isteği, yazarın verileriyle birlikte bir 200 OK yanıt döndürür. Geçersiz diğer ad isteği bir 204 No Content yanıt döndürür.

Accept üst bilgisi

İçerik anlaşması , istekte bir Accept üst bilgi görüntülendiğinde gerçekleşir. Bir istek "accept" başlığı içerdiğinde ASP.NET Core:

  • Kabul üst bilgisindeki medya türlerini tercih sırasına göre numaralandırır.
  • Belirtilen biçimlerden birinde yanıt oluşturabilen bir biçimlendirici bulmaya çalışır.

İstemcinin isteğini karşılayan bir biçimlendirici bulunamazsa ASP.NET Core:

  • MvcOptions.ReturnHttpNotAcceptable true olarak ayarlandığında 406 Not Acceptable değerini döndürür veya -
  • Yanıt üretebilecek ilk biçimlendiriciyi bulmaya çalışır.

İstenen biçim için yapılandırılan bir biçimlendirici yoksa, nesneyi biçimlendirebilen ilk biçimlendirici kullanılır. İstekte üst Accept bilgi görünmüyorsa:

  • Nesneyi işleyebilen ilk biçimlendirici, yanıtı seri hale getirmek için kullanılır.
  • Herhangi bir pazarlık yok. Sunucu hangi biçimin döndürüleceği konusunda karara varıyor.

Accept üst bilgisi */* içeriyorsa, MvcOptions üst bilgisi RespectBrowserAcceptHeader true olarak ayarlanmadığı sürece yoksayılır.

Tarayıcılar ve içerik anlaşması

Tipik API istemcilerinden farklı olarak, web tarayıcıları Accept üst bilgileri sağlar. Web tarayıcıları joker karakterler de dahil olmak üzere birçok biçim belirtir. Varsayılan olarak, çerçeve isteğin bir tarayıcıdan geldiğini algıladığında:

  • Başlık Accept yoksayılır.
  • İçerik, aksi yapılandırılmadığı sürece yanıt türünü işleyebilen ilk kayıtlı çıkış biçimlendiricisi kullanılarak döndürülür.

Bu yaklaşım, API'leri kullanırken tarayıcılar arasında daha tutarlı bir deneyim sağlar.

Bir uygulamayı tarayıcının kabul üst bilgilerini onurlandıracak şekilde yapılandırmak için RespectBrowserAcceptHeader'yi true olarak ayarlayın.

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers(options =>
    {
        options.RespectBrowserAcceptHeader = true; // false by default
    });
}

Biçimlendiricileri yapılandırma

Ek biçimleri desteklemesi gereken uygulamalar uygun NuGet paketlerini ekleyebilir ve desteği yapılandırabilir. Giriş ve çıkış için ayrı biçimlendiriciler vardır. Giriş biçimlendiricileri Model Bağlama tarafından kullanılır. Çıkış biçimlendiricileri yanıtları biçimlendirmek için kullanılır. Özel biçimlendirici oluşturma hakkında bilgi için bkz . Özel Biçimlendiriciler.

XML biçimi desteği ekleme

XmlSerializer kullanılarak uygulanan XML biçimlendiricileri, AddXmlSerializerFormatters çağrılarak yapılandırılır.

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers()
        .AddXmlSerializerFormatters();
}

Yukarıdaki kod, sonuçları XmlSerializer kullanarak serileştirir.

Yukarıdaki kodu kullanırken denetleyici yöntemleri, isteğin Accept üst bilgisine göre uygun biçimi döndürür.

System.Text.Json tabanlı biçimlendiricileri yapılandır

System.Text.Json tabanlı biçimlendiricilerin özellikleri Microsoft.AspNetCore.Mvc.JsonOptions.JsonSerializerOptions kullanılarak yapılandırılabilir. Varsayılan biçimlendirme camelCase'dir. Aşağıdaki vurgulanmış kod PascalCase biçimlendirmesini ayarlar:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers()
        .AddJsonOptions(options =>
            options.JsonSerializerOptions.PropertyNamingPolicy = null);
}

Aşağıdaki eylem yöntemi ControllerBase.Problem çağrısında bulunarak bir ProblemDetails yanıtı oluşturur:

[HttpGet("error")]
public IActionResult GetError()
{
    return Problem("Something went wrong!");
}

Yukarıdaki kodla:

  • https://localhost:5001/WeatherForecast/temperature PascalCase döndürür.
  • https://localhost:5001/WeatherForecast/error camelCase döndürür. Uygulama biçimi PascalCase olarak belirlese bile hata yanıtı her zaman camelCase olur. ProblemDetails, küçük harf belirten RFC 7807'yi izler

Aşağıdaki kod PascalCase'i ayarlar ve özel bir dönüştürücü ekler:

services.AddControllers().AddJsonOptions(options =>
{
    // Use the default property (Pascal) casing.
    options.JsonSerializerOptions.PropertyNamingPolicy = null;

    // Configure a custom converter.
    options.JsonSerializerOptions.Converters.Add(new MyCustomJsonConverter());
});

Eylem başına çıkış serileştirme seçenekleri kullanılarak JsonResultyapılandırılabilir. Örneğin:

public IActionResult Get()
{
    return Json(model, new JsonSerializerOptions
    {
        WriteIndented = true,
    });
}

Newtonsoft.Json tabanlı JSON biçimi desteği ekleme

Varsayılan JSON biçimlendiricileri System.Text.Json üzerine kuruludur. Newtonsoft.Json tabanlı biçimlendiriciler ve özellikler için destek, Microsoft.AspNetCore.Mvc.NewtonsoftJson NuGet paketini yükleyip Startup.ConfigureServices içinde yapılandırarak sağlanabilir.

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers()
        .AddNewtonsoftJson();
}

Yukarıdaki kodda, AddNewtonsoftJson çağrısı, aşağıdaki Web API'si, MVC ve Razor Pages özelliklerini Newtonsoft.Json kullanacak şekilde yapılandırıyor.

Bazı özellikler System.Text.Json tabanlı biçimlendiricilerle düzgün çalışmayabilir ve Newtonsoft.Json tabanlı biçimlendiricilere referans gerektirebilir. Bu Newtonsoft.Json-tabanlı biçimlendiricileri uygulama şu durumlarda kullanmaya devam edin:

  • Newtonsoft.Json özniteliklerini kullanır. Örneğin, [JsonProperty] veya [JsonIgnore].
  • Serileştirme ayarlarını özelleştirir.
  • Newtonsoft.Json tarafından sağlanan özelliklere dayanır.

Newtonsoft.Json tabanlı biçimlendiricilerin özellikleri, Microsoft.AspNetCore.Mvc.MvcNewtonsoftJsonOptions.SerializerSettings kullanılarak yapılandırılabilir.

services.AddControllers().AddNewtonsoftJson(options =>
{
    // Use the default property (Pascal) casing
    options.SerializerSettings.ContractResolver = new DefaultContractResolver();

    // Configure a custom converter
    options.SerializerSettings.Converters.Add(new MyCustomJsonConverter());
});

Eylem başına çıkış serileştirme seçenekleri kullanılarak JsonResultyapılandırılabilir. Örneğin:

public IActionResult Get()
{
    return Json(model, new JsonSerializerSettings
    {
        Formatting = Formatting.Indented,
    });
}

Biçim belirtme

Yanıt biçimlerini kısıtlamak için filtreyi [Produces] uygulayın. Çoğu Filtre gibi, [Produces] eylem düzeyinde, denetleyici düzeyinde veya genel kapsamda uygulanabilir.

[ApiController]
[Route("[controller]")]
[Produces("application/json")]
public class WeatherForecastController : ControllerBase
{

Yukarıdaki [Produces] filtre:

  • Denetleyicinin içindeki tüm eylemleri, POCO'lar (Düz Eski CLR Nesneleri) veya ObjectResult ve türevleri için JSON biçimli yanıtlar döndürmeye zorlar.
  • Diğer biçimlendiriciler yapılandırılırsa ve istemci farklı bir biçim belirtirse, JSON döndürülür.

Daha fazla bilgi için bkz . Filtreler.

Özel durum biçimlendiricileri

Bazı özel durumlar yerleşik biçimlendiriciler kullanılarak uygulanır. Varsayılan olarak, string dönüş türleri metin/düz biçiminde formatlanır (eğer Accept başlığı üzerinden istenirse metin/html). StringOutputFormatter kaldırılarak bu davranış silinebilir. Biçimlendiriciler, ConfigureServices yöntemi içinde kaldırılır. Model nesnesi dönüş türüne sahip eylemler, 204 No Content döndürdüğünde null döndürür. Bu davranış HttpNoContentOutputFormatter kaldırılarak silinebilir. Aşağıdaki kod StringOutputFormatter ve HttpNoContentOutputFormatter öğelerini kaldırır.

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers(options =>
    {
        // requires using Microsoft.AspNetCore.Mvc.Formatters;
        options.OutputFormatters.RemoveType<StringOutputFormatter>();
        options.OutputFormatters.RemoveType<HttpNoContentOutputFormatter>();
    });
}

StringOutputFormatter olmadan, yerleşik JSON biçimlendirici string döndürme türlerini biçimlendirir. Yerleşik JSON biçimlendiricisi kaldırılırsa ve xml biçimlendirici kullanılabilir durumdaysa, XML biçimlendirici biçimleri string türleri döndürür. Aksi takdirde, string dönüş türleri döndürür 406 Not Acceptable.

HttpNoContentOutputFormatter olmadan, null nesneler yapılandırılmış biçimlendiriciyle biçimlendirilir. Örneğin:

  • JSON biçimlendiricisi, gövdesinde null olan bir yanıt döndürür.
  • XML biçimlendirici, öznitelik xsi:nil="true" kümesine sahip boş bir XML öğesi döndürür.

Yanıt biçimi URL eşlemeleri

İstemciler URL'nin bir parçası olarak belirli bir biçim isteyebilir, örneğin:

  • Sorgu dizesinde veya yolun bir bölümünde.
  • .xml veya .json gibi biçime özgü bir dosya uzantısı kullanarak.

İstek yolundan eşleme, API'nin kendi izlediği yol içinde belirtilmelidir. Örneğin:

[Route("api/[controller]")]
[ApiController]
[FormatFilter]
public class ProductsController : ControllerBase
{
    [HttpGet("{id}.{format?}")]
    public Product Get(int id)
    {

Yukarıdaki yol, istenen biçimin isteğe bağlı bir dosya uzantısı olarak belirtilmesine izin verir. [FormatFilter] özniteliği içindeki RouteData biçim değerinin varlığını denetler ve yanıt oluşturulduğunda yanıt biçimini uygun biçimlendiriciyle eşler.

Route Formatter
/api/products/5 Varsayılan çıkış biçimlendiricisi
/api/products/5.json JSON biçimlendiricisi (yapılandırıldıysa)
/api/products/5.xml XML biçimlendiricisi (yapılandırıldıysa)

ASP.NET Core MVC, belirtilen biçimleri kullanarak veya istemcinin isteğine yanıt olarak yanıt verilerini biçimlendirmeyi destekler.

Biçime Özgü Eylem Sonuçları

Bazı eylem sonuç türleri ve JsonResultgibi ContentResult belirli bir biçime özeldir. Eylemler, istemcinin farklı bir biçim isteğini yoksayarak her zaman belirtilen biçimi kullanan sonuçlar döndürebilir. Örneğin, JsonResult geri döndürmek JSON biçimli verileri ve ContentResult geri döndürmek düz metin biçimli dize verilerini döndürür.

Belirli bir türü döndürmek için eylem gerekmez. ASP.NET Core herhangi bir nesne dönüş değerini destekler. Tür olmayan IActionResult nesneleri döndüren eylemlerden elde edilen sonuçlar, uygun IOutputFormatter uygulama kullanılarak serileştirilir. Daha fazla bilgi için bkz ASP.NET Core web API'sinde denetleyici işlem dönüş türleri.

Varsayılan olarak, yerleşik yardımcı yöntemi ControllerBase.Ok JSON biçimli verileri döndürür:

[HttpGet]
public IActionResult Get()
    => Ok(_todoItemStore.GetList());

Örnek kod, yapılacaklar öğelerinin listesini döndürür. Önceki kodla F12 tarayıcı geliştirici araçlarını veya http-repl'i kullanarak şunları görüntüler:

  • Yanıt üst bilgisi içeren content-type:application/json; charset=utf-8.
  • İstek üst bilgileri. Örneğin, Accept üst bilgi. Önceki kod tarafından Accept üst bilgi yoksayılır.

Düz metin biçimlendirilmiş verileri döndürmek için ContentResult ve Content yardımcısını kullanın.

[HttpGet("Version")]
public ContentResult GetVersion()
    => Content("v1.0.0");

Önceki kodda döndürülen Content-Typetext/plain değeridir.

Birden çok dönüş türüne sahip eylemler için döndürün IActionResult. Örneğin, işlemin sonucuna göre farklı HTTP durum kodları döndürürken.

İçerik anlaşması

İstemci bir Accept üst bilgisi belirttiğinde içerik anlaşması gerçekleşir. ASP.NET Core tarafından kullanılan varsayılan biçim JSON'dır. İçerik anlaşması şu şekildedir:

  • ObjectResult tarafından uygulanır.
  • Yardımcı yöntemlerden döndürülen durum koduna özgü eylem sonuçlarında yerleşik olarak bulunur. Eylem sonuçları yardımcı yöntemleri ObjectResult'ya dayanır.

Bir model türü döndürüldüğünde dönüş türü ObjectResult'dir.

Aşağıdaki eylem yöntemi ve OkNotFound yardımcı yöntemlerini kullanır:

[HttpGet("{id:long}")]
public IActionResult GetById(long id)
{
    var todo = _todoItemStore.GetById(id);

    if (todo is null)
    {
        return NotFound();
    }

    return Ok(todo);
}

Varsayılan olarak, ASP.NET Core aşağıdaki medya türlerini destekler:

  • application/json
  • text/json
  • text/plain

Araçlar, örneğin Fiddler veya http-repl, yanıt formatını belirtmek için Accept istek başlığını ayarlayabilir. Sunucunun desteklediği bir türü içerdiğinde, Accept üst bilgisi bu türü döndürür. Sonraki bölümde ek biçimlendiricilerin nasıl ekleneceği gösterilmektedir.

Denetleyici (Controller) eylemleri, POCO'lar (Düz Eski CLR Nesneleri) döndürebilir. PoCO döndürülürken çalışma zamanı otomatik olarak nesneyi sarmalayan bir ObjectResult oluşturur. İstemci, biçimlendirilmiş serileştirilmiş nesneyi alır. Döndürülen nesne ise null, bir 204 No Content yanıt döndürülür.

Aşağıdaki örnek bir nesne türü döndürür:

[HttpGet("{id:long}")]
public TodoItem? GetById(long id)
    => _todoItemStore.GetById(id);

Önceki kodda geçerli bir yapılacaklar öğesine yönelik bir istek, bir 200 OK yanıt döndürür. Geçersiz bir yapılacaklar öğesi isteği bir 204 No Content yanıt döndürür.

Accept üst bilgisi

İçerik anlaşması , istekte bir Accept üst bilgi görüntülendiğinde gerçekleşir. Bir istek "accept" başlığı içerdiğinde ASP.NET Core:

  • Kabul üst bilgisindeki medya türlerini tercih sırasına göre numaralandırır.
  • Belirtilen biçimlerden birinde yanıt oluşturabilen bir biçimlendirici bulmaya çalışır.

İstemcinin isteğini karşılayan bir biçimlendirici bulunamazsa ASP.NET Core:

  • MvcOptions.ReturnHttpNotAcceptable true olarak ayarlandığında 406 Not Acceptable değerini döndürür veya -
  • Yanıt üretebilecek ilk biçimlendiriciyi bulmaya çalışır.

İstenen biçim için yapılandırılan bir biçimlendirici yoksa, nesneyi biçimlendirebilen ilk biçimlendirici kullanılır. İstekte üst Accept bilgi görünmüyorsa:

  • Nesneyi işleyebilen ilk biçimlendirici, yanıtı seri hale getirmek için kullanılır.
  • Herhangi bir pazarlık yok. Sunucu hangi biçimin döndürüleceği konusunda karara varıyor.

Accept üst bilgisi */* içeriyorsa, MvcOptions üst bilgisi RespectBrowserAcceptHeader true olarak ayarlanmadığı sürece yoksayılır.

Tarayıcılar ve içerik anlaşması

Tipik API istemcilerinden farklı olarak, web tarayıcıları Accept üst bilgileri sağlar. Web tarayıcıları joker karakterler de dahil olmak üzere birçok biçim belirtir. Varsayılan olarak, çerçeve isteğin bir tarayıcıdan geldiğini algıladığında:

  • Başlık Accept yoksayılır.
  • İçerik, aksi yapılandırılmadığı sürece yanıt türünü işleyebilen ilk kayıtlı çıkış biçimlendiricisi kullanılarak döndürülür.

Bu yaklaşım, API'leri kullanırken tarayıcılar arasında daha tutarlı bir deneyim sağlar.

Bir uygulamayı tarayıcı kabul üst bilgilerine saygı gösterecek şekilde yapılandırmak için RespectBrowserAcceptHeader özelliğinin true olarak ayarlanması gerekir.

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers(options =>
{
    options.RespectBrowserAcceptHeader = true;
});

Biçimlendiricileri yapılandırma

Ek biçimleri desteklemesi gereken uygulamalar uygun NuGet paketlerini ekleyebilir ve desteği yapılandırabilir. Giriş ve çıkış için ayrı biçimlendiriciler vardır. Giriş biçimlendiricileri Model Bağlama tarafından kullanılır. Çıkış biçimlendiricileri yanıtları biçimlendirmek için kullanılır. Özel biçimlendirici oluşturma hakkında bilgi için bkz . Özel Biçimlendiriciler.

XML biçimi desteği ekleme

XML biçimlendiricilerini kullanılarak yapılandırmak için çağrısını gerçekleştirin.

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers()
    .AddXmlSerializerFormatters();

Yukarıdaki kodu kullanırken denetleyici yöntemleri, isteğin Accept üst bilgisine göre uygun biçimi döndürür.

Tabanlı System.Text.Json biçimlendiricileri yapılandırma

Tabanlı biçimlendiricilerin System.Text.Jsonözelliklerini yapılandırmak için kullanın Microsoft.AspNetCore.Mvc.JsonOptions.JsonSerializerOptions. Aşağıdaki vurgulanmış kod varsayılan camelCase biçimlendirmesi yerine PascalCase biçimlendirmesini yapılandırıyor:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers()
    .AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.PropertyNamingPolicy = null;
    });

Belirli eylemler için çıkış serileştirme seçeneklerini yapılandırmak için kullanın JsonResult. Örneğin:

[HttpGet]
public IActionResult Get() 
    => new JsonResult(
        _todoItemStore.GetList(),
        new JsonSerializerOptions { PropertyNamingPolicy = null });

Newtonsoft.Json-tabanlı JSON biçimi desteği ekle

Varsayılan JSON biçimlendiricileri kullanır System.Text.Json. Tabanlı biçimlendiricileri kullanmak için Newtonsoft.Json olan NuGet paketini yükleyin Microsoft.AspNetCore.Mvc.NewtonsoftJson ve Program.cs içinde yapılandırın.

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers()
    .AddNewtonsoftJson();

Yukarıdaki kodda, AddNewtonsoftJson çağrısı, aşağıdaki Web API, MVC ve Razor Pages özelliklerini Newtonsoft.Json kullanacak şekilde yapılandırıyor.

Bazı özellikler System.Text.Json tabanlı biçimlendiricilerle iyi çalışmayabilir ve Newtonsoft.Json tabanlı biçimlendiricilere referans gerektirebilir. Uygulama Newtonsoft.Json tabanlı formatlayıcıları kullanmaya devam ettiğinde:

  • Newtonsoft.Json öznitelikleri kullanır. Örneğin, [JsonProperty] veya [JsonIgnore].
  • Serileştirme ayarlarını özelleştirir.
  • Newtonsoft.Json tarafından sağlanan özelliklere dayanır.

Newtonsoft.Json tabanlı biçimlendiricilerin özelliklerini yapılandırmak için SerializerSettings kullanabilirsiniz.

builder.Services.AddControllers()
    .AddNewtonsoftJson(options =>
    {
        options.SerializerSettings.ContractResolver = new DefaultContractResolver();
    });

Belirli eylemler için çıkış serileştirme seçeneklerini yapılandırmak için kullanın JsonResult. Örneğin:

[HttpGet]
public IActionResult GetNewtonsoftJson()
    => new JsonResult(
        _todoItemStore.GetList(),
        new JsonSerializerSettings { ContractResolver = new DefaultContractResolver() });

ProblemDetails ve ValidationProblemDetails yanıtlarını biçimlendir

Aşağıdaki aksiyon metodu, bir yanıt oluşturmak için ControllerBase.Problem'yi çağırırProblemDetails.

[HttpGet("Error")]
public IActionResult GetError()
    => Problem("Something went wrong.");

ProblemDetails Uygulama biçimi PascalCase olarak belirlese bile yanıt her zaman camelCase şeklindedir. ProblemDetails, küçük harf belirten RFC 7807'yi izler.

Öznitelik bir denetleyici sınıfına [ApiController] uygulandığında, ValidationProblemDetails denetleyici, Model Doğrulaması başarısız olduğunda bir yanıt oluşturur. Bu yanıt, modelin özellik adlarını değişmeden hata anahtarları olarak kullanan bir sözlük içerir. Örneğin, aşağıdaki model doğrulama gerektiren tek bir özellik içerir:

public class SampleModel
{
    [Range(1, 10)]
    public int Value { get; set; }
}

Varsayılan olarak, ValidationProblemDetails özellik geçersiz olduğunda Value döndürülen yanıt, aşağıdaki örnekte gösterildiği gibi hata anahtarını Valuekullanır:

{
  "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
  "title": "One or more validation errors occurred.",
  "status": 400,
  "traceId": "00-00000000000000000000000000000000-000000000000000-00",
  "errors": {
    "Value": [
      "The field Value must be between 1 and 10."
    ]
  }
}

Özellik adlarını hata anahtarları olarak biçimlendirmek için, bir uygulamayı IMetadataDetailsProvider koleksiyonuna MvcOptions.ModelMetadataDetailsProviders ekleyin. Aşağıdaki örnek, System.Text.Jsonözellik adlarını varsayılan olarak camelCase olarak biçimlendiren tabanlı bir SystemTextJsonValidationMetadataProvideruygulama ekler:

builder.Services.AddControllers();

builder.Services.Configure<MvcOptions>(options =>
{
    options.ModelMetadataDetailsProviders.Add(
        new SystemTextJsonValidationMetadataProvider());
});

SystemTextJsonValidationMetadataProvider ayrıca, oluşturucusunda, özellik adlarını biçimlendirmek için özel bir adlandırma ilkesi belirten bir JsonNamingPolicy implementasyonunu kabul eder.

Model içindeki bir özelliğin özel adını ayarlamak için özelliğinde [JsonPropertyName] özniteliğini kullanın:

public class SampleModel
{
    [Range(1, 10)]
    [JsonPropertyName("sampleValue")]
    public int Value { get; set; }
}

ValidationProblemDetails Özellik geçersiz olduğunda Value önceki model için döndürülen yanıt, aşağıdaki örnekte gösterildiği gibi hata anahtarını sampleValuekullanır:

{
  "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
  "title": "One or more validation errors occurred.",
  "status": 400,
  "traceId": "00-00000000000000000000000000000000-000000000000000-00",
  "errors": {
    "sampleValue": [
      "The field Value must be between 1 and 10."
    ]
  }
}

Yanıtı ValidationProblemDetails kullanarak biçimlendirmek için Newtonsoft.Json kullanın: NewtonsoftJsonValidationMetadataProvider

builder.Services.AddControllers()
    .AddNewtonsoftJson();

builder.Services.Configure<MvcOptions>(options =>
{
    options.ModelMetadataDetailsProviders.Add(
        new NewtonsoftJsonValidationMetadataProvider());
});

Varsayılan olarak, NewtonsoftJsonValidationMetadataProvider özellik adlarını camelCase olarak biçimlendirmektedir. NewtonsoftJsonValidationMetadataProvider oluşturucusunda özellik adlarını biçimlendirmek için özel bir NamingPolicy adlandırma ilkesini belirten uygulamayı da kabul eder. Model içindeki bir özelliğin özel adını ayarlamak için özniteliğini [JsonProperty] kullanın.

Biçim belirtme

Yanıt biçimlerini kısıtlamak için filtreyi [Produces] uygulayın. Çoğu Filtre gibi, [Produces] eylemde, denetleyicide veya genel kapsamda uygulanabilir.

[ApiController]
[Route("api/[controller]")]
[Produces("application/json")]
public class TodoItemsController : ControllerBase

Yukarıdaki [Produces] filtre:

  • Denetleyici içindeki tüm eylemleri POCO'lar (Düz Eski CLR Nesneleri) veya ObjectResult türetilmiş türleri için JSON biçimli yanıtlar döndürmeye zorlar.
  • Diğer biçimlendiriciler yapılandırılmış olsa ve istemci farklı bir biçim belirtse bile JSON biçimli yanıtlar döndürür.

Daha fazla bilgi için bkz . Filtreler.

Özel durum biçimlendiricileri

Bazı özel durumlar yerleşik biçimlendiriciler kullanılarak uygulanır. Varsayılan olarak, string dönüş türleri metin/düz olarak biçimlendirilir (istek halinde Accept üstbilgisi aracılığıyla metin/html). Bu davranış, StringOutputFormatter kaldırılarak silinebilir. Program.cs içindeki biçimlendiriciler kaldırılır. Model nesnesi dönüş türüne sahip eylemler, null döndürülürken 204 No Content döndürür. Bu davranış, HttpNoContentOutputFormatter kaldırılarak silinebilir. Aşağıdaki kod StringOutputFormatter ve HttpNoContentOutputFormatter öğelerini kaldırır.

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers(options =>
{
    // using Microsoft.AspNetCore.Mvc.Formatters;
    options.OutputFormatters.RemoveType<StringOutputFormatter>();
    options.OutputFormatters.RemoveType<HttpNoContentOutputFormatter>();
});

StringOutputFormatter olmadan, yerleşik JSON biçimlendirici string dönüş türlerini biçimlendirir. Yerleşik JSON biçimlendiricisi kaldırılırsa ve xml biçimlendirici kullanılabilir durumdaysa, XML biçimlendirici biçimleri string türleri döndürür. Aksi takdirde, string dönüş türleri döndürür 406 Not Acceptable.

"HttpNoContentOutputFormatter olmadan, null nesneler, yapılandırılan biçimlendirici kullanılarak biçimlendirilir." Örneğin:

  • JSON biçimlendiricisi, gövdesi null olan bir yanıt döndürür.
  • XML biçimlendirici, öznitelik xsi:nil="true" kümesine sahip boş bir XML öğesi döndürür.

Yanıt biçimi URL eşlemeleri

İstemciler URL'nin bir parçası olarak belirli bir biçim isteyebilir, örneğin:

  • Sorgu dizesinde veya yolun bir kısmında.
  • .xml veya .json gibi biçime özgü bir dosya uzantısı kullanarak.

İstek yolunun eşlenmesi, API'nin kullandığı rota yapılandırmasında belirtilmelidir. Örneğin:

[ApiController]
[Route("api/[controller]")]
[FormatFilter]
public class TodoItemsController : ControllerBase
{
    private readonly TodoItemStore _todoItemStore;

    public TodoItemsController(TodoItemStore todoItemStore)
        => _todoItemStore = todoItemStore;

    [HttpGet("{id:long}.{format?}")]
    public TodoItem? GetById(long id)
        => _todoItemStore.GetById(id);

Yukarıdaki yol, isteğe bağlı bir dosya uzantısı kullanılarak istenen biçimin belirtilmesine izin verir. [FormatFilter] özniteliği içindeki RouteData biçim değerinin varlığını denetler ve yanıt oluşturulduğunda yanıt biçimini uygun biçimlendiriciyle eşler.

Route Formatter
/api/todoitems/5 Varsayılan çıkış biçimlendiricisi
/api/todoitems/5.json JSON biçimlendiricisi (yapılandırıldıysa)
/api/todoitems/5.xml XML biçimlendiricisi (yapılandırıldıysa)

Polimorfik deserializasyon

Yerleşik özellikler sınırlı bir polimorfik serileştirme kapasitesi sağlar fakat seri durumdan çıkarma desteği sunmaz. Seri durumdan çıkarma için özel bir dönüştürücü gerekir. Tam bir polimorfik seri durumdan çıkarma örneği için bkz. Polimorfik seri durumdan çıkarma.

Ek kaynaklar