Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
ASP.NET Core MVC támogatja a válaszadatok formázását megadott formátumok használatával vagy az ügyfél kérésére válaszul.
Formátumspecifikus művelet eredményei
Egyes műveleteredmény-típusok egy adott formátumra vonatkoznak, például JsonResult és ContentResult. A műveletek olyan eredményeket adhatnak vissza, amelyek mindig egy megadott formátumot használnak, figyelmen kívül hagyva az ügyfél más formátumra vonatkozó kérését. A visszatérési JsonResult érték például JSON formátumú adatokat ad vissza, a visszaadott ContentResult adatok pedig egyszerű szöveges formátumú sztringadatokat ad vissza.
Egy adott típus visszaadásához nincs szükség műveletre. ASP.NET Core támogat bármilyen objektumszintű visszatérési értéket. A nem IActionResult típusok objektumait visszaadó műveletek eredményei a megfelelő IOutputFormatter implementációval szerializálva lesznek. További információ: Vezérlőművelet visszatérési típusai a ASP.NET Core webes API-ban.
A beépített segédmetódus ControllerBase.Ok alapértelmezés szerint JSON formátumú adatokat ad vissza:
[HttpGet]
public IActionResult Get() =>
Ok(_todoItemStore.GetList());
A mintakód a teendők listáját adja vissza. Az F12 böngésző fejlesztői eszközeinek vagy a http-repl előző kódjával történő használata megjeleníti:
- A tartalomtípust tartalmazó válaszfejléc:
application/json; charset=utf-8 - A kérelem fejlécei. Például a
Acceptfejlécet. AAcceptfejlécet az előző kód figyelmen kívül hagyja.
Egyszerű szöveges formátumú adatok visszaadásához használja a ContentResult és a Content segédet.
[HttpGet("Version")]
public ContentResult GetVersion() =>
Content("v1.0.0");
Az előző kódrészletben a Content-Type visszatérített érték a text/plain.
Több visszatérési típussal rendelkező műveletek esetén adja vissza a következőt IActionResult: . Ha például a művelet eredménye alapján különböző HTTP-állapotkódokat ad vissza.
Tartalom egyeztetése
A tartalom egyeztetése akkor történik, ha az ügyfél egy Accept fejlécet ad meg. A ASP.NET Core által használt alapértelmezett formátum a JSON. A tartalom egyeztetése a következő:
- Implementálva: ObjectResult.
- Beépített az állapotkód-specifikus művelet eredményeibe, amelyeket a segítő metódusok adnak vissza. A műveleti eredmények segédmetódusai a
ObjectResult-on alapulnak.
Modelltípus visszaadásakor a visszatérési típus a következő ObjectResult: .
A következő műveletmetódus a segédmetódusokat OkNotFound használja:
[HttpGet("{id:long}")]
public IActionResult GetById(long id)
{
var todo = _todoItemStore.GetById(id);
if (todo is null)
{
return NotFound();
}
return Ok(todo);
}
Alapértelmezés szerint a ASP.NET Core a következő médiatípusokat támogatja:
application/jsontext/jsontext/plain
Az olyan eszközök, mint a Fiddler vagy a curl, beállíthatják a Accept kérés fejlécét a visszatérési formátum megadására. Ha a Accept fejléc olyan típust tartalmaz, amelyet a kiszolgáló támogat, a rendszer ezt a típust adja vissza. A következő szakasz bemutatja, hogyan adhat hozzá további formázókat.
A vezérlőműveletek POCO-kat (egyszerű régi CLR-objektumokat) adhatnak vissza. POCO visszaadásakor a futtatókörnyezet automatikusan létrehoz egy ObjectResult-t, amely becsomagolja az objektumot. Az ügyfél megkapja a formázott szerializált objektumot. Ha a visszaadott objektum az null, a 204 No Content rendszer választ ad vissza.
Az alábbi példa egy objektumtípust ad vissza:
[HttpGet("{id:long}")]
public TodoItem? GetById(long id) =>
_todoItemStore.GetById(id);
Az előző kódban egy érvényes teendőelemre vonatkozó kérés válaszként 200 OK ad vissza. Egy érvénytelen teendőelemre vonatkozó kérés 204 No Content választ ad vissza.
Az Accept fejléc
A tartalom egyeztetésére akkor kerül sor, amikor egy Accept fejléc jelenik meg a kérelemben. Ha egy kérelem elfogadó fejlécet tartalmaz, ASP.NET Core:
- Az elfogadás fejlécében szereplő médiatípusok számbavétele beállítási sorrendben.
- Olyan formázót próbál megkeresni, amely a megadott formátumok egyikében tud választ adni.
Ha nem található olyan formázó, amely megfelel az ügyfél kérésének, ASP.NET Core:
- Visszaadja
406 Not Acceptable, ha MvcOptions.ReturnHttpNotAcceptable be van állítvatrue-ra vagy - - Megkeresi az első formázót, amely képes választ generálni.
Ha nincs formázó a kért formátumhoz konfigurálva, a rendszer az objektumot formázó első formázót használja. Ha a kérés nem tartalmaz Accept fejlécet:
- Az objektumot kezelő első formázó szerializálja a választ.
- Nincs tárgyalás. A kiszolgáló határozza meg, hogy milyen formátumot kell visszaadni.
Ha az Elfogadás fejléc tartalmazza */*, a fejléc figyelmen kívül lesz hagyva, kivéve, ha RespectBrowserAcceptHeader igaz értékre MvcOptionsvan állítva.
Böngészők és tartalom egyeztetése
A tipikus API-ügyfelektől eltérően a webböngészők fejléceket biztosítanak Accept . A webböngészők számos formátumot határoznak meg, beleértve a helyettesítő karaktereket is. Alapértelmezés szerint, ha a keretrendszer azt észleli, hogy a kérés böngészőből érkezik:
- A
Acceptfejléc figyelmen kívül lesz hagyva. - A tartalom JSON-ban lesz visszaadva, hacsak nincs más konfigurálva.
Ez a megközelítés konzisztensebb élményt nyújt a böngészőkben az API-k használata során.
Ha úgy szeretne konfigurálni egy alkalmazást, hogy megfeleljen a böngészőben az elfogadási fejléceket, állítsa a következőre a RespectBrowserAcceptHeader tulajdonságot: true.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers(options =>
{
options.RespectBrowserAcceptHeader = true;
});
Formázók konfigurálása
Az extra formátumok támogatásához szükséges alkalmazások hozzáadhatják a megfelelő NuGet-csomagokat, és konfigurálhatják a támogatást. A bemenethez és a kimenethez külön formátumok tartoznak. A bemeneti formázókat a modellkötés használja. A kimeneti formázók a válaszok formázására szolgálnak. Az egyéni formázók létrehozásáról további információt az Egyéni formázók című témakörben talál.
XML-formátum támogatása
Az XmlSerializer által implementált XML-formázók konfigurálásához hívja meg a AddXmlSerializerFormatters:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers()
.AddXmlSerializerFormatters();
Az előző kód használatakor a vezérlő metódusai a kérés fejléce Accept alapján visszaadják a megfelelő formátumot.
System.Text.Json alapú formázók konfigurálása
A(z) System.Text.Json alapú formázók funkcióinak konfigurálásához használja a Microsoft.AspNetCore.Mvc.JsonOptions.JsonSerializerOptions. Az alábbi kiemelt kód a PascalCase formázást konfigurálja az alapértelmezett camelCase formázás helyett:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers()
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.PropertyNamingPolicy = null;
});
A következő műveletmetódus meghívja a ControllerBase.Problem függvényt egy ProblemDetails válasz létrehozásához.
[HttpGet("Error")]
public IActionResult GetError() =>
Problem("Something went wrong.");
A ProblemDetails válasz mindig camelCase, még akkor is, ha az alkalmazás PascalCase formátumot állít be.
ProblemDetails az RFC 7807-et követi, amely kisbetűt ad meg.
A kimeneti szerializálási beállítások adott műveletekhez való konfigurálásához használja JsonResulta következőt: . Például:
[HttpGet]
public IActionResult Get() =>
new JsonResult(
_todoItemStore.GetList(),
new JsonSerializerOptions
{
PropertyNamingPolicy = null
});
Newtonsoft.Json-alapú JSON formátum támogatásának hozzáadása
Az alapértelmezett JSON-formázók a következőt használják System.Text.Json: . A(z) Newtonsoft.Json alapú formázók használatához telepítse a Microsoft.AspNetCore.Mvc.NewtonsoftJson NuGet-csomagot, és konfigurálja a Program.cs.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers()
.AddNewtonsoftJson();
Az előző kódban a AddNewtonsoftJson hívás konfigurálja a következő Web API-, MVC- és Razor Pages-funkciók használatát Newtonsoft.Json:
- JSON-t olvasó és író bemeneti és kimeneti formázók
- JsonResult
- JSON-javítás
- IJsonHelper
- TempData
Előfordulhat, hogy egyes funkciók nem működnek megfelelően a System.Text.Json alapú formázókkal, és hivatkozni kell a Newtonsoft.Json alapú formázókra. Folytassa a Newtonsoft.Json alapú formázók használatát, amikor az alkalmazás:
- A
Newtonsoft.Jsonattribútumokat használja. Például,[JsonProperty]vagy[JsonIgnore]. - Testre szabja a szerializálási beállításokat.
- A szolgáltatásokra
Newtonsoft.Jsontámaszkodik.
A Newtonsoft.Json alapú formatter funkcióinak konfigurálásához használja a SerializerSettings elemet.
builder.Services.AddControllers()
.AddNewtonsoftJson(options =>
{
options.SerializerSettings.ContractResolver = new DefaultContractResolver();
});
A kimeneti szerializálási beállítások adott műveletekhez való konfigurálásához használja JsonResulta következőt: . Például:
[HttpGet]
public IActionResult GetNewtonsoftJson() =>
new JsonResult(
_todoItemStore.GetList(),
new JsonSerializerSettings
{
ContractResolver = new DefaultContractResolver()
});
Formátum megadása
A válaszformátumok korlátozásához alkalmazza a szűrőt [Produces] . A legtöbb szűrő alkalmazható a művelet, a vezérlő vagy a globális hatókör szintjén:
[ApiController]
[Route("api/[controller]")]
[Produces("application/json")]
public class TodoItemsController : ControllerBase
Az előző [Produces] szűrő:
- Kényszeríti a vezérlőn belüli összes műveletet, hogy JSON-formátumú válaszokat ad vissza a POCOS-okra (egyszerű régi CLR-objektumok) vagy ObjectResult annak származtatott típusaira.
- JSON-formátumú válaszokat ad vissza akkor is, ha más formázók vannak konfigurálva, és az ügyfél más formátumot ad meg.
További információ: Szűrők.
Speciális esetformázók
Néhány speciális eset beépített formázókkal van implementálva. Alapértelmezés szerint a string visszatérési típusok szövegként/egyszerűként vannak formázva (szöveg/html, ha a fejlécen keresztül kérik).Accept Ez a viselkedés törölhető az StringOutputFormatter eltávolításával. A formázók törlődnek a fájlból Program.cs. Azokban az esetekben, amikor a műveletek modellobjektum visszatérési típussal rendelkeznek, 204 No Content adódik vissza, amikor a null a visszatérési érték. Ez a viselkedés törölhető az HttpNoContentOutputFormatter eltávolításával. Az alábbi kód eltávolítja a StringOutputFormatter és HttpNoContentOutputFormatter-t.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers(options =>
{
// using Microsoft.AspNetCore.Mvc.Formatters;
options.OutputFormatters.RemoveType<StringOutputFormatter>();
options.OutputFormatters.RemoveType<HttpNoContentOutputFormatter>();
});
A StringOutputFormatter hiányában a beépített JSON formázó formázza a string visszatérési típusokat. Ha a beépített JSON-formázó el lett távolítva, és elérhető egy XML-formázó, az XML-formázó formátumok string típusokat ad vissza. Ellenkező esetben a string visszatérési típusok 406 Not Acceptable-t adnak vissza.
HttpNoContentOutputFormatter nélkül a null objektumok a konfigurált formázó használatával vannak formázva. Például:
- A JSON-formázó egy olyan választ ad vissza, amelynek törzse a következő
null: . - Az XML-formázó egy üres XML-elemet ad vissza az attribútumkészlettel
xsi:nil="true".
Válaszformátum URL-leképezései
Az ügyfelek az URL-cím részeként kérhetnek egy adott formátumot, például:
- A lekérdezési sztringben vagy az elérési út egy részében.
- Formátumspecifikus fájlkiterjesztés, például .xml vagy .jsonhasználatával.
A kérelem elérési útjának leképezését az API által használt útvonalon kell megadni. Például:
[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);
Az előző útvonal lehetővé teszi a kért formátum megadását opcionális fájlkiterjesztés használatával. Az [FormatFilter] attribútum ellenőrzi, hogy létezik-e a formátumérték a RouteData fájlban, és a válaszformátumot a válasz létrehozásakor a megfelelő formázóhoz rendeli.
| Route | Formatter |
|---|---|
/api/todoitems/5 |
Az alapértelmezett kimeneti formátum |
/api/todoitems/5.json |
A JSON-formázó (ha konfigurálva van) |
/api/todoitems/5.xml |
Az XML-formázó (ha konfigurálva van) |
Polimorf deszerializálás
A beépített funkciók a polimorf szerializálás korlátozott körét biztosítják, de egyáltalán nem támogatják a deszerializálást. A deszerializáláshoz egyéni konverter szükséges. A polimorf deszerializálás teljes mintájáért lásd a polimorf deszerializálást .
További erőforrások
- Mintakód megtekintése vagy letöltése (hogyan töltsd le)
ASP.NET Core MVC támogatja a válaszadatok formázását. A válaszadatok adott formátumokkal vagy az ügyfél által kért formátumra válaszul formázhatók.
Mintakód megtekintése vagy letöltése (hogyan töltsd le)
Formátumspecifikus művelet eredményei
Egyes műveleteredmény-típusok egy adott formátumra vonatkoznak, például JsonResult és ContentResult. A műveletek az ügyfélbeállításoktól függetlenül egy adott formátumban formázott eredményeket adhatnak vissza. A visszatérés például JSON-formátumú adatokat ad vissza JsonResult . A ContentResult vagy egy sztring visszaadása egyszerű szöveges formátumú sztringadatokat eredményez.
Egy adott típus visszaadásához nincs szükség műveletre. ASP.NET Core támogat bármilyen objektumszintű visszatérési értéket. A nem IActionResult típusok objektumait visszaadó műveletek eredményei a megfelelő IOutputFormatter implementációval szerializálva lesznek. További információ: Vezérlőművelet visszatérési típusai a ASP.NET Core webes API-ban.
A beépített segédmetódus Ok JSON formátumú adatokat ad vissza:
// GET: api/authors
[HttpGet]
public ActionResult Get()
{
return Ok(_authors.List());
}
A mintaletöltés visszaadja a szerzők listáját. Az F12 böngésző fejlesztői eszközei vagy a http-repl használata az előző kóddal:
- Megjelenik a tartalomtípust
application/json; charset=utf-8tartalmazó válaszfejléc. - Megjelennek a kérelemfejlécek. Például a
Acceptfejlécet. AAcceptfejlécet az előző kód figyelmen kívül hagyja.
Egyszerű szöveges formátumú adatok visszaadásához használja a ContentResult és a Content segédet.
// GET api/authors/about
[HttpGet("About")]
public ContentResult About()
{
return Content("An API listing authors of docs.asp.net.");
}
Az előző kódrészletben a Content-Type visszatérített érték a text/plain. Sztring visszaadása Content-Typetext/plain:
// GET api/authors/version
[HttpGet("version")]
public string Version()
{
return "Version 1.0.0";
}
Több visszatérési típussal rendelkező műveletek esetén adja vissza a következőt IActionResult: . Például különböző HTTP-állapotkódokat ad vissza az elvégzett műveletek eredménye alapján.
Tartalom egyeztetése
A tartalom egyeztetése akkor történik, ha az ügyfél egy Accept fejlécet ad meg. A ASP.NET Core által használt alapértelmezett formátum a JSON. A tartalom egyeztetése a következő:
- Implementálva: ObjectResult.
- Beépített az állapotkód-specifikus művelet eredményeibe, amelyeket a segítő metódusok adnak vissza. A műveleti eredmények segédmetódusai a
ObjectResult-on alapulnak.
Modelltípus visszaadásakor a visszatérési típus a következő ObjectResult: .
A következő műveletmetódus a segédmetódusokat OkNotFound használja:
// 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);
}
Alapértelmezés szerint az ASP.NET Core támogatja a application/json, text/json és text/plain médiatípusokat. Az olyan eszközök, mint a Fiddler vagy a http-repl , beállíthatják a Accept kérés fejlécét a visszatérési formátum megadására. Ha a Accept fejléc olyan típust tartalmaz, amelyet a kiszolgáló támogat, a rendszer ezt a típust adja vissza. A következő szakasz bemutatja, hogyan adhat hozzá további formázókat.
A vezérlőműveletek POCO-kat (egyszerű régi CLR-objektumokat) adhatnak vissza. POCO visszaadásakor a futtatókörnyezet automatikusan létrehoz egy ObjectResult-t, amely becsomagolja az objektumot. Az ügyfél megkapja a formázott szerializált objektumot. Ha a visszaadott objektum az null, a 204 No Content rendszer választ ad vissza.
Objektumtípus visszaadása:
// GET api/authors/RickAndMSFT
[HttpGet("{alias}")]
public Author Get(string alias)
{
return _authors.GetByAlias(alias);
}
Az előző kódban egy érvényes szerzői aliasra vonatkozó kérés választ ad 200 OK vissza a szerző adataival. Egy érvénytelen aliasra vonatkozó kérés visszaad egy 204 No Content választ.
Az Accept fejléc
A tartalom egyeztetésére akkor kerül sor, amikor egy Accept fejléc jelenik meg a kérelemben. Ha egy kérelem elfogadó fejlécet tartalmaz, ASP.NET Core:
- Az elfogadás fejlécében szereplő médiatípusok számbavétele beállítási sorrendben.
- Olyan formázót próbál megkeresni, amely a megadott formátumok egyikében tud választ adni.
Ha nem található olyan formázó, amely megfelel az ügyfél kérésének, ASP.NET Core:
- Visszaadja
406 Not Acceptable, ha MvcOptions.ReturnHttpNotAcceptable be van állítvatrue-ra vagy - - Megkeresi az első formázót, amely képes választ generálni.
Ha nincs formázó a kért formátumhoz konfigurálva, a rendszer az objektumot formázó első formázót használja. Ha a kérés nem tartalmaz Accept fejlécet:
- Az objektumot kezelő első formázó szerializálja a választ.
- Nincs tárgyalás. A kiszolgáló határozza meg, hogy milyen formátumot kell visszaadni.
Ha az Elfogadás fejléc tartalmazza */*, a fejléc figyelmen kívül lesz hagyva, kivéve, ha RespectBrowserAcceptHeader igaz értékre MvcOptionsvan állítva.
Böngészők és tartalom egyeztetése
A tipikus API-ügyfelektől eltérően a webböngészők fejléceket biztosítanak Accept . A webböngészők számos formátumot határoznak meg, beleértve a helyettesítő karaktereket is. Alapértelmezés szerint, ha a keretrendszer azt észleli, hogy a kérés böngészőből érkezik:
- A
Acceptfejléc figyelmen kívül lesz hagyva. - A tartalom JSON-ban lesz visszaadva, hacsak nincs más konfigurálva.
Ez a megközelítés konzisztensebb élményt nyújt a böngészőkben az API-k használata során.
Ha úgy szeretné konfigurálni az alkalmazást, hogy tiszteletben tartsa a böngésző "accept" fejléceit, állítsa be a RespectBrowserAcceptHeader értékét true-re.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers(options =>
{
options.RespectBrowserAcceptHeader = true; // false by default
});
}
Formázók konfigurálása
A további formátumok támogatásához szükséges alkalmazások hozzáadhatják a megfelelő NuGet-csomagokat, és konfigurálhatják a támogatást. A bemenethez és a kimenethez külön formátumok tartoznak. A bemeneti formázókat a modellkötés használja. A kimeneti formázók a válaszok formázására szolgálnak. Az egyéni formázók létrehozásáról további információt az Egyéni formázók című témakörben talál.
XML-formátum támogatása
Az XML-formázók, amelyeket a XmlSerializer használatával implementáltak, a AddXmlSerializerFormatters meghívásával vannak konfigurálva.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers()
.AddXmlSerializerFormatters();
}
Az előző kód szerializálja az eredményeket a következő használatával XmlSerializer: .
Az előző kód használatakor a vezérlő metódusai a kérés fejléce Accept alapján visszaadják a megfelelő formátumot.
Bázis alapú formázók konfigurálása System.Text.Json
A System.Text.Json alapú formázók funkciói a Microsoft.AspNetCore.Mvc.JsonOptions.JsonSerializerOptions használatával konfigurálhatók. Az alapértelmezett formázási típus a camelCase. A következő kiemelt kód a PascalCase-formázást alkalmazza:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers()
.AddJsonOptions(options =>
options.JsonSerializerOptions.PropertyNamingPolicy = null);
}
A következő műveletmetódus meghívja a ControllerBase.Problem függvényt egy ProblemDetails válasz létrehozásához.
[HttpGet("error")]
public IActionResult GetError()
{
return Problem("Something went wrong!");
}
Az előző kóddal:
-
https://localhost:5001/WeatherForecast/temperaturePascalCase értéket ad vissza. -
https://localhost:5001/WeatherForecast/errorvisszaad camelCase-t. A hibaválasz mindig camelCase, még akkor is, ha az alkalmazás PascalCase formátumot állít be.ProblemDetailsaz RFC 7807-et követi, amely a kisbetűk használatát írja elő.
A következő kód beállítja a PascalCaset, és hozzáad egy egyéni konvertert:
services.AddControllers().AddJsonOptions(options =>
{
// Use the default property (Pascal) casing.
options.JsonSerializerOptions.PropertyNamingPolicy = null;
// Configure a custom converter.
options.JsonSerializerOptions.Converters.Add(new MyCustomJsonConverter());
});
Műveletenként konfigurálhatók a kimeneti szerializálási beállítások JsonResult segítségével. Például:
public IActionResult Get()
{
return Json(model, new JsonSerializerOptions
{
WriteIndented = true,
});
}
Newtonsoft.Json-alapú JSON-formátum támogatásának hozzáadása
Az alapértelmezett JSON-formázók System.Text.Json alapulnak.
Newtonsoft.Json Az alapú formázók és funkciók támogatása elérhető a Microsoft.AspNetCore.Mvc.NewtonsoftJson NuGet-csomag telepítésével és konfigurálásával Startup.ConfigureServices.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers()
.AddNewtonsoftJson();
}
Az előző kódban a AddNewtonsoftJson hívás konfigurálja a következő Web API-, MVC- és Razor Pages-funkciók használatát Newtonsoft.Json:
- JSON-t olvasó és író bemeneti és kimeneti formázók
- JsonResult
- JSON-javítás
- IJsonHelper
- TempData
Előfordulhat, hogy egyes funkciók nem működnek megfelelően a System.Text.Json alapú formázókkal, és hivatkozni kell a Newtonsoft.Json alapú formázókra. Folytassa a Newtonsoft.Json alapú formázók használatát, amikor az alkalmazás:
- A
Newtonsoft.Jsonattribútumokat használja. Például,[JsonProperty]vagy[JsonIgnore]. - Testre szabja a szerializálási beállításokat.
- A szolgáltatásokra
Newtonsoft.Jsontámaszkodik.
A Newtonsoft.Json alapú formázók funkciói a Microsoft.AspNetCore.Mvc.MvcNewtonsoftJsonOptions.SerializerSettings használatával konfigurálhatók.
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());
});
Műveletenként konfigurálhatók a kimeneti szerializálási beállítások JsonResult segítségével. Például:
public IActionResult Get()
{
return Json(model, new JsonSerializerSettings
{
Formatting = Formatting.Indented,
});
}
Formátum megadása
A válaszformátumok korlátozásához alkalmazza a szűrőt [Produces] . A legtöbb szűrő alkalmazható a művelet, a vezérlő vagy a globális hatókör szintjén:
[ApiController]
[Route("[controller]")]
[Produces("application/json")]
public class WeatherForecastController : ControllerBase
{
Az előző [Produces] szűrő:
- Kényszeríti a vezérlőn belüli összes műveletet, hogy JSON-formátumú válaszokat ad vissza a POCOS-okra (egyszerű régi CLR-objektumok) vagy ObjectResult annak származtatott típusaira.
- Ha más formázók vannak konfigurálva, és az ügyfél más formátumot ad meg, a JSON vissza lesz adva.
További információ: Szűrők.
Speciális esetformázók
Néhány speciális eset beépített formázókkal van implementálva. Alapértelmezés szerint a string visszatérési típusok szövegként/egyszerűként vannak formázva (szöveg/html, ha a fejlécen keresztül kérik).Accept Ez a viselkedés törölhető az StringOutputFormatter eltávolításával. A formázók a ConfigureServices metódusban eltávolításra kerülnek. Azokban az esetekben, amikor a műveletek modellobjektum visszatérési típussal rendelkeznek, 204 No Content adódik vissza, amikor a null a visszatérési érték. Ez a viselkedés törölhető az HttpNoContentOutputFormatter eltávolításával. Az alábbi kód eltávolítja a StringOutputFormatter és HttpNoContentOutputFormatter-t.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers(options =>
{
// requires using Microsoft.AspNetCore.Mvc.Formatters;
options.OutputFormatters.RemoveType<StringOutputFormatter>();
options.OutputFormatters.RemoveType<HttpNoContentOutputFormatter>();
});
}
A StringOutputFormatter hiányában a beépített JSON formázó formázza a string visszatérési típusokat. Ha a beépített JSON-formázó el lett távolítva, és elérhető egy XML-formázó, az XML-formázó formátumok string típusokat ad vissza. Ellenkező esetben a string visszatérési típusok 406 Not Acceptable-t adnak vissza.
HttpNoContentOutputFormatter nélkül a null objektumok a konfigurált formázó használatával vannak formázva. Például:
- A JSON-formázó egy olyan választ ad vissza, amelynek törzse a következő
null: . - Az XML-formázó egy üres XML-elemet ad vissza az attribútumkészlettel
xsi:nil="true".
Válaszformátum URL-leképezései
Az ügyfelek az URL-cím részeként kérhetnek egy adott formátumot, például:
- A lekérdezési sztringben vagy az elérési út egy részében.
- Formátumspecifikus fájlkiterjesztés, például .xml vagy .jsonhasználatával.
A kérelem elérési útjának leképezését az API által használt útvonalon kell megadni. Például:
[Route("api/[controller]")]
[ApiController]
[FormatFilter]
public class ProductsController : ControllerBase
{
[HttpGet("{id}.{format?}")]
public Product Get(int id)
{
Az előző útvonal lehetővé teszi a kért formátum megadását opcionális fájlkiterjesztésként. Az [FormatFilter] attribútum ellenőrzi, hogy létezik-e a formátumérték a RouteData fájlban, és a válaszformátumot a válasz létrehozásakor a megfelelő formázóhoz rendeli.
| Route | Formatter |
|---|---|
/api/products/5 |
Az alapértelmezett kimeneti formátum |
/api/products/5.json |
A JSON-formázó (ha konfigurálva van) |
/api/products/5.xml |
Az XML-formázó (ha konfigurálva van) |
ASP.NET Core MVC támogatja a válaszadatok formázását megadott formátumok használatával vagy az ügyfél kérésére válaszul.
Formátumspecifikus művelet eredményei
Egyes műveleteredmény-típusok egy adott formátumra vonatkoznak, például JsonResult és ContentResult. A műveletek olyan eredményeket adhatnak vissza, amelyek mindig egy megadott formátumot használnak, figyelmen kívül hagyva az ügyfél más formátumra vonatkozó kérését. A visszatérési JsonResult érték például JSON formátumú adatokat ad vissza, a visszaadott ContentResult adatok pedig egyszerű szöveges formátumú sztringadatokat ad vissza.
Egy adott típus visszaadásához nincs szükség műveletre. ASP.NET Core támogat bármilyen objektumszintű visszatérési értéket. A nem IActionResult típusok objektumait visszaadó műveletek eredményei a megfelelő IOutputFormatter implementációval szerializálva lesznek. További információ: Vezérlőművelet visszatérési típusai a ASP.NET Core webes API-ban.
A beépített segédmetódus ControllerBase.Ok alapértelmezés szerint JSON formátumú adatokat ad vissza:
[HttpGet]
public IActionResult Get()
=> Ok(_todoItemStore.GetList());
A mintakód a teendők listáját adja vissza. Az F12 böngésző fejlesztői eszközeinek vagy a http-repl előző kódjával történő használata megjeleníti:
- A tartalomtípust tartalmazó válaszfejléc:
application/json; charset=utf-8 - A kérelem fejlécei. Például a
Acceptfejlécet. AAcceptfejlécet az előző kód figyelmen kívül hagyja.
Egyszerű szöveges formátumú adatok visszaadásához használja a ContentResult és a Content segédet.
[HttpGet("Version")]
public ContentResult GetVersion()
=> Content("v1.0.0");
Az előző kódrészletben a Content-Type visszatérített érték a text/plain.
Több visszatérési típussal rendelkező műveletek esetén adja vissza a következőt IActionResult: . Ha például a művelet eredménye alapján különböző HTTP-állapotkódokat ad vissza.
Tartalom egyeztetése
A tartalom egyeztetése akkor történik, ha az ügyfél egy Accept fejlécet ad meg. A ASP.NET Core által használt alapértelmezett formátum a JSON. A tartalom egyeztetése a következő:
- Implementálva: ObjectResult.
- Beépített az állapotkód-specifikus művelet eredményeibe, amelyeket a segítő metódusok adnak vissza. A műveleti eredmények segédmetódusai a
ObjectResult-on alapulnak.
Modelltípus visszaadásakor a visszatérési típus a következő ObjectResult: .
A következő műveletmetódus a segédmetódusokat OkNotFound használja:
[HttpGet("{id:long}")]
public IActionResult GetById(long id)
{
var todo = _todoItemStore.GetById(id);
if (todo is null)
{
return NotFound();
}
return Ok(todo);
}
Alapértelmezés szerint a ASP.NET Core a következő médiatípusokat támogatja:
application/jsontext/jsontext/plain
Az olyan eszközök, mint a Fiddler vagy a http-repl , beállíthatják a Accept kérés fejlécét a visszatérési formátum megadására. Ha a Accept fejléc olyan típust tartalmaz, amelyet a kiszolgáló támogat, a rendszer ezt a típust adja vissza. A következő szakasz bemutatja, hogyan adhat hozzá további formázókat.
A vezérlőműveletek POCO-kat (egyszerű régi CLR-objektumokat) adhatnak vissza. POCO visszaadásakor a futtatókörnyezet automatikusan létrehoz egy ObjectResult-t, amely becsomagolja az objektumot. Az ügyfél megkapja a formázott szerializált objektumot. Ha a visszaadott objektum az null, a 204 No Content rendszer választ ad vissza.
Az alábbi példa egy objektumtípust ad vissza:
[HttpGet("{id:long}")]
public TodoItem? GetById(long id)
=> _todoItemStore.GetById(id);
Az előző kódban egy érvényes teendőelemre vonatkozó kérés válaszként 200 OK ad vissza. Egy érvénytelen teendőelemre vonatkozó kérés 204 No Content választ ad vissza.
Az Accept fejléc
A tartalom egyeztetésére akkor kerül sor, amikor egy Accept fejléc jelenik meg a kérelemben. Ha egy kérelem elfogadó fejlécet tartalmaz, ASP.NET Core:
- Az elfogadás fejlécében szereplő médiatípusok számbavétele beállítási sorrendben.
- Olyan formázót próbál megkeresni, amely a megadott formátumok egyikében tud választ adni.
Ha nem található olyan formázó, amely megfelel az ügyfél kérésének, ASP.NET Core:
- Visszaadja
406 Not Acceptable, ha MvcOptions.ReturnHttpNotAcceptable be van állítvatrue-ra vagy - - Megkeresi az első formázót, amely képes választ generálni.
Ha nincs formázó a kért formátumhoz konfigurálva, a rendszer az objektumot formázó első formázót használja. Ha a kérés nem tartalmaz Accept fejlécet:
- Az objektumot kezelő első formázó szerializálja a választ.
- Nincs tárgyalás. A kiszolgáló határozza meg, hogy milyen formátumot kell visszaadni.
Ha az Elfogadás fejléc tartalmazza */*, a fejléc figyelmen kívül lesz hagyva, kivéve, ha RespectBrowserAcceptHeader igaz értékre MvcOptionsvan állítva.
Böngészők és tartalom egyeztetése
A tipikus API-ügyfelektől eltérően a webböngészők fejléceket biztosítanak Accept . A webböngészők számos formátumot határoznak meg, beleértve a helyettesítő karaktereket is. Alapértelmezés szerint, ha a keretrendszer azt észleli, hogy a kérés böngészőből érkezik:
- A
Acceptfejléc figyelmen kívül lesz hagyva. - A tartalom JSON-ban lesz visszaadva, hacsak nincs más konfigurálva.
Ez a megközelítés konzisztensebb élményt nyújt a böngészőkben az API-k használata során.
Ha úgy szeretne konfigurálni egy alkalmazást, hogy megfeleljen a böngészőben az elfogadási fejléceket, állítsa a következőre a RespectBrowserAcceptHeader tulajdonságot: true.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers(options =>
{
options.RespectBrowserAcceptHeader = true;
});
Formázók konfigurálása
Az extra formátumok támogatásához szükséges alkalmazások hozzáadhatják a megfelelő NuGet-csomagokat, és konfigurálhatják a támogatást. A bemenethez és a kimenethez külön formátumok tartoznak. A bemeneti formázókat a modellkötés használja. A kimeneti formázók a válaszok formázására szolgálnak. Az egyéni formázók létrehozásáról további információt az Egyéni formázók című témakörben talál.
XML-formátum támogatása
Az XmlSerializer által implementált XML-formázók konfigurálásához hívja meg a AddXmlSerializerFormatters:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers()
.AddXmlSerializerFormatters();
Az előző kód használatakor a vezérlő metódusai a kérés fejléce Accept alapján visszaadják a megfelelő formátumot.
System.Text.Json alapú formázók konfigurálása
A(z) System.Text.Json alapú formázók funkcióinak konfigurálásához használja a Microsoft.AspNetCore.Mvc.JsonOptions.JsonSerializerOptions. Az alábbi kiemelt kód a PascalCase formázást konfigurálja az alapértelmezett camelCase formázás helyett:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers()
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.PropertyNamingPolicy = null;
});
A kimeneti szerializálási beállítások adott műveletekhez való konfigurálásához használja JsonResulta következőt: . Például:
[HttpGet]
public IActionResult Get()
=> new JsonResult(
_todoItemStore.GetList(),
new JsonSerializerOptions { PropertyNamingPolicy = null });
Newtonsoft.Json-alapú JSON formátum támogatásának hozzáadása
Az alapértelmezett JSON-formázók a következőt használják System.Text.Json: . A(z) Newtonsoft.Json alapú formázók használatához telepítse a Microsoft.AspNetCore.Mvc.NewtonsoftJson NuGet-csomagot, és konfigurálja a Program.cs.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers()
.AddNewtonsoftJson();
Az előző kódban a AddNewtonsoftJson hívás konfigurálja a következő Web API-, MVC- és Razor Pages-funkciók használatát Newtonsoft.Json:
- JSON-t olvasó és író bemeneti és kimeneti formázók
- JsonResult
- JSON-javítás
- IJsonHelper
- TempData
Előfordulhat, hogy egyes funkciók nem működnek megfelelően a System.Text.Json alapú formázókkal, és hivatkozni kell a Newtonsoft.Json alapú formázókra. Folytassa a Newtonsoft.Json alapú formázók használatát, amikor az alkalmazás:
- A
Newtonsoft.Jsonattribútumokat használja. Például,[JsonProperty]vagy[JsonIgnore]. - Testre szabja a szerializálási beállításokat.
- A szolgáltatásokra
Newtonsoft.Jsontámaszkodik.
A Newtonsoft.Json alapú formatter funkcióinak konfigurálásához használja a SerializerSettings elemet.
builder.Services.AddControllers()
.AddNewtonsoftJson(options =>
{
options.SerializerSettings.ContractResolver = new DefaultContractResolver();
});
A kimeneti szerializálási beállítások adott műveletekhez való konfigurálásához használja JsonResulta következőt: . Például:
[HttpGet]
public IActionResult GetNewtonsoftJson()
=> new JsonResult(
_todoItemStore.GetList(),
new JsonSerializerSettings { ContractResolver = new DefaultContractResolver() });
Formázd meg a ProblemDetails és ValidationProblemDetails válaszokat
A következő műveletmetódus meghívja a ControllerBase.Problem függvényt egy ProblemDetails válasz létrehozásához.
[HttpGet("Error")]
public IActionResult GetError()
=> Problem("Something went wrong.");
A ProblemDetails válasz mindig camelCase, még akkor is, ha az alkalmazás PascalCase formátumot állít be.
ProblemDetails az RFC 7807-et követi, amely kisbetűt ad meg.
Amikor az [ApiController] attribútumot egy vezérlőosztályra alkalmazza, a vezérlő választ hoz létre ValidationProblemDetails , ha a modell érvényesítése sikertelen. Ez a válasz tartalmaz egy szótárt, amely a modell tulajdonságneveit hibakulcsként használja, változatlanul. A következő modell például egyetlen, érvényesítést igénylő tulajdonságot tartalmaz:
public class SampleModel
{
[Range(1, 10)]
public int Value { get; set; }
}
A válasz, amelyet ValidationProblemDetails érvénytelen Value tulajdonság esetén alapértelmezés szerint visszaadnak, a Value hibakulcsot használja, ahogyan az a következő példában látható:
{
"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."
]
}
}
A hibakulcsként használt tulajdonságnevek formázásához adja hozzá a IMetadataDetailsProvider implementációját a MvcOptions.ModelMetadataDetailsProviders gyűjteményhez. Az alábbi példa egy -alapú implementációt System.Text.Jsonad hozzá, SystemTextJsonValidationMetadataProvideramely alapértelmezés szerint camelCaseként formázja a tulajdonságneveket:
builder.Services.AddControllers();
builder.Services.Configure<MvcOptions>(options =>
{
options.ModelMetadataDetailsProviders.Add(
new SystemTextJsonValidationMetadataProvider());
});
SystemTextJsonValidationMetadataProvider Emellett elfogadja a konstruktor implementációját JsonNamingPolicy is, amely egy egyéni elnevezési szabályzatot határoz meg a tulajdonságnevek formázásához.
A modellen belüli tulajdonság egyéni nevének beállításához használja a [JsonPropertyName] attribútumot a tulajdonságon:
public class SampleModel
{
[Range(1, 10)]
[JsonPropertyName("sampleValue")]
public int Value { get; set; }
}
A ValidationProblemDetails válasz, amelyet az előző modellnél kapunk, ha a Value tulajdonság érvénytelen, a következő hibakulcsot sampleValue használja, amint az a következő példában látható:
{
"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."
]
}
}
A ValidationProblemDetails válasz formázásához a következő Newtonsoft.Json használja: NewtonsoftJsonValidationMetadataProvider
builder.Services.AddControllers()
.AddNewtonsoftJson();
builder.Services.Configure<MvcOptions>(options =>
{
options.ModelMetadataDetailsProviders.Add(
new NewtonsoftJsonValidationMetadataProvider());
});
Alapértelmezés szerint NewtonsoftJsonValidationMetadataProvider a tulajdonságneveket camelCase formátumban formázta.
NewtonsoftJsonValidationMetadataProvider Emellett elfogadja a konstruktor implementációját NamingPolicy is, amely egy egyéni elnevezési szabályzatot határoz meg a tulajdonságnevek formázásához. A modellen belüli tulajdonság egyéni nevének beállításához használja az [JsonProperty] attribútumot.
Formátum megadása
A válaszformátumok korlátozásához alkalmazza a szűrőt [Produces] . A legtöbb szűrő alkalmazható a művelet, a vezérlő vagy a globális hatókör szintjén:
[ApiController]
[Route("api/[controller]")]
[Produces("application/json")]
public class TodoItemsController : ControllerBase
Az előző [Produces] szűrő:
- Kényszeríti a vezérlőn belüli összes műveletet, hogy JSON-formátumú válaszokat ad vissza a POCOS-okra (egyszerű régi CLR-objektumok) vagy ObjectResult annak származtatott típusaira.
- JSON-formátumú válaszokat ad vissza akkor is, ha más formázók vannak konfigurálva, és az ügyfél más formátumot ad meg.
További információ: Szűrők.
Speciális esetformázók
Néhány speciális eset beépített formázókkal van implementálva. Alapértelmezés szerint a string visszatérési típusok szövegként/egyszerűként vannak formázva (szöveg/html, ha a fejlécen keresztül kérik).Accept Ez a viselkedés törölhető az StringOutputFormatter eltávolításával. A formázók törlődnek a fájlból Program.cs. Azokban az esetekben, amikor a műveletek modellobjektum visszatérési típussal rendelkeznek, 204 No Content adódik vissza, amikor a null a visszatérési érték. Ez a viselkedés törölhető az HttpNoContentOutputFormatter eltávolításával. Az alábbi kód eltávolítja a StringOutputFormatter és HttpNoContentOutputFormatter-t.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers(options =>
{
// using Microsoft.AspNetCore.Mvc.Formatters;
options.OutputFormatters.RemoveType<StringOutputFormatter>();
options.OutputFormatters.RemoveType<HttpNoContentOutputFormatter>();
});
A StringOutputFormatter hiányában a beépített JSON formázó formázza a string visszatérési típusokat. Ha a beépített JSON-formázó el lett távolítva, és elérhető egy XML-formázó, az XML-formázó formátumok string típusokat ad vissza. Ellenkező esetben a string visszatérési típusok 406 Not Acceptable-t adnak vissza.
HttpNoContentOutputFormatter nélkül a null objektumok a konfigurált formázó használatával vannak formázva. Például:
- A JSON-formázó egy olyan választ ad vissza, amelynek törzse a következő
null: . - Az XML-formázó egy üres XML-elemet ad vissza az attribútumkészlettel
xsi:nil="true".
Válaszformátum URL-leképezései
Az ügyfelek az URL-cím részeként kérhetnek egy adott formátumot, például:
- A lekérdezési sztringben vagy az elérési út egy részében.
- Formátumspecifikus fájlkiterjesztés, például .xml vagy .jsonhasználatával.
A kérelem elérési útjának leképezését az API által használt útvonalon kell megadni. Például:
[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);
Az előző útvonal lehetővé teszi a kért formátum megadását opcionális fájlkiterjesztés használatával. Az [FormatFilter] attribútum ellenőrzi, hogy létezik-e a formátumérték a RouteData fájlban, és a válaszformátumot a válasz létrehozásakor a megfelelő formázóhoz rendeli.
| Route | Formatter |
|---|---|
/api/todoitems/5 |
Az alapértelmezett kimeneti formátum |
/api/todoitems/5.json |
A JSON-formázó (ha konfigurálva van) |
/api/todoitems/5.xml |
Az XML-formázó (ha konfigurálva van) |
Polimorf deszerializálás
A beépített funkciók a polimorf szerializálás korlátozott körét biztosítják, de egyáltalán nem támogatják a deszerializálást. A deszerializáláshoz egyéni konverter szükséges. A polimorf deszerializálás teljes mintájáért lásd a polimorf deszerializálást .
További erőforrások
- Mintakód megtekintése vagy letöltése (hogyan töltsd le)