Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
ASP.NET Core MVC ondersteunt het opmaken van antwoordgegevens, met behulp van opgegeven indelingen of in reactie op de aanvraag van een client.
Opmaakspecifieke actieresultaten
Sommige typen actieresultaten zijn specifiek voor een bepaalde indeling, zoals JsonResult en ContentResult. Acties kunnen resultaten retourneren die altijd een opgegeven indeling gebruiken, waarbij de aanvraag van een client voor een andere indeling wordt genegeerd. Als u bijvoorbeeld JsonResult
JSON-geformatteerde gegevens retourneert en ContentResult
tekenreeksgegevens zonder opmaak retourneert.
Een actie is niet vereist om een specifiek type te retourneren. ASP.NET Core ondersteunt elke retourwaarde van objecten. Resultaten van acties die objecten retourneren die geen IActionResult typen zijn, worden geserialiseerd met behulp van de juiste IOutputFormatter implementatie. Zie Retourtypen controlleractie in ASP.NET Core-web-API voor meer informatie.
Standaard retourneert de ingebouwde helpermethode ControllerBase.Ok JSON-geformatteerde gegevens:
[HttpGet]
public IActionResult Get() =>
Ok(_todoItemStore.GetList());
De voorbeeldcode retourneert een lijst met takenitems. Met behulp van de ontwikkelhulpprogramma's van de F12-browser of http-repl met de vorige code wordt het volgende weergegeven:
- De antwoordheader met inhoudstype:
application/json; charset=utf-8
. - De aanvraagheaders. Bijvoorbeeld de
Accept
koptekst. DeAccept
header wordt genegeerd door de voorgaande code.
Als u opgemaakte gegevens zonder opmaak wilt retourneren, gebruikt ContentResult u en de Content helper:
[HttpGet("Version")]
public ContentResult GetVersion() =>
Content("v1.0.0");
In de voorgaande code is text/plain
de Content-Type
geretourneerde waarde.
Voor acties met meerdere retourtypen, retour IActionResult
. Als u bijvoorbeeld verschillende HTTP-statuscodes retourneert op basis van het resultaat van de bewerking.
Content negotiation
Inhoudsonderhandeling vindt plaats wanneer de client een Accept-header opgeeft. De standaardindeling die wordt gebruikt door ASP.NET Core is JSON. Inhoudsonderhandeling is:
- Geïmplementeerd door ObjectResult.
- Ingebouwd in de statuscodespecifieke actieresultaten die worden geretourneerd door de helpermethoden. De helpermethoden voor actieresultaten zijn gebaseerd op
ObjectResult
.
Wanneer een modeltype wordt geretourneerd, is ObjectResult
het retourtype.
De volgende actiemethode maakt gebruik van de Ok
en NotFound
helpermethoden:
[HttpGet("{id:long}")]
public IActionResult GetById(long id)
{
var todo = _todoItemStore.GetById(id);
if (todo is null)
{
return NotFound();
}
return Ok(todo);
}
Standaard ondersteunt ASP.NET Core de volgende mediatypen:
application/json
text/json
text/plain
Hulpprogramma's zoals Fiddler of curl kunnen de Accept
aanvraagheader instellen om de retourindeling op te geven. Wanneer de Accept
header een type bevat dat door de server wordt ondersteund, wordt dat type geretourneerd. In de volgende sectie ziet u hoe u extra formatters toevoegt.
Controlleracties kunnen POCO's (gewone oude CLR-objecten) retourneren. Wanneer een POCO wordt geretourneerd, maakt de runtime automatisch een ObjectResult
object dat het object verpakt. De client haalt het opgemaakte geserialiseerde object op. Als het geretourneerde object is null
, wordt er een 204 No Content
antwoord geretourneerd.
In het volgende voorbeeld wordt een objecttype geretourneerd:
[HttpGet("{id:long}")]
public TodoItem? GetById(long id) =>
_todoItemStore.GetById(id);
In de voorgaande code retourneert een aanvraag voor een geldig todo-item een 200 OK
antwoord. Een aanvraag voor een ongeldig taakitem retourneert een 204 No Content
antwoord.
De kopTekst Accepteren
Inhoudsonderhandeling vindt plaats wanneer er een Accept
header wordt weergegeven in de aanvraag. Wanneer een aanvraag een acceptheader bevat, ASP.NET Core:
- Opsomming van de mediatypen in de accept-header in voorkeursvolgorde.
- Hiermee wordt geprobeerd een formatter te vinden die een antwoord kan produceren in een van de opgegeven indelingen.
Als er geen formatter wordt gevonden die aan de aanvraag van de client kan voldoen, ASP.NET Core:
- Retourneert
406 Not Acceptable
als MvcOptions.ReturnHttpNotAcceptable deze is ingesteld optrue
, of - - Hiermee wordt geprobeerd de eerste formatter te vinden die een antwoord kan produceren.
Als er geen formatter is geconfigureerd voor de aangevraagde indeling, wordt de eerste formatter gebruikt waarmee het object kan worden opgemaakt. Als er geen Accept
header wordt weergegeven in de aanvraag:
- De eerste formatter die het object kan verwerken, wordt gebruikt om het antwoord te serialiseren.
- Er vindt geen onderhandeling plaats. De server bepaalt welke indeling moet worden geretourneerd.
Als de kopTekst Accepteren bevat */*
, wordt de koptekst genegeerd, tenzij RespectBrowserAcceptHeader
deze is ingesteld op waar op MvcOptions.
Browsers en inhoudsonderhandeling
In tegenstelling tot typische API-clients leveren Accept
webbrowsers headers. Webbrowsers geven veel indelingen op, waaronder jokertekens. Wanneer het framework standaard detecteert dat de aanvraag afkomstig is van een browser:
- De
Accept
koptekst wordt genegeerd. - De inhoud wordt geretourneerd in JSON, tenzij anders geconfigureerd.
Deze benadering biedt een consistentere ervaring in browsers bij het gebruik van API's.
Als u een app wilt configureren voor het respecteren van browserheaders, stelt u de RespectBrowserAcceptHeader eigenschap true
in op:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers(options =>
{
options.RespectBrowserAcceptHeader = true;
});
Configure formatters
Apps die extra indelingen moeten ondersteunen, kunnen de juiste NuGet-pakketten toevoegen en ondersteuning configureren. Er zijn afzonderlijke formatters voor invoer en uitvoer. Invoerindelingen worden gebruikt door Modelbinding. Uitvoerindelingen worden gebruikt om antwoorden op te maken. Zie Custom Formatters voor meer informatie over het maken van een aangepaste formatter.
Ondersteuning voor XML-indeling toevoegen
Als u XML-formatters wilt configureren die zijn geïmplementeerd met behulp van XmlSerializer, roept u het volgende AddXmlSerializerFormattersaan:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers()
.AddXmlSerializerFormatters();
Wanneer u de voorgaande code gebruikt, retourneren controllermethoden de juiste indeling op basis van de header van Accept
de aanvraag.
Op -gebaseerde formatters configureren System.Text.Json
Als u functies voor de System.Text.Json
op -gebaseerde formatters wilt configureren, gebruikt u Microsoft.AspNetCore.Mvc.JsonOptions.JsonSerializerOptions. Met de volgende gemarkeerde code wordt PascalCase-opmaak geconfigureerd in plaats van de standaardopmaak van camelCase:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers()
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.PropertyNamingPolicy = null;
});
Met de volgende actiemethode wordt ControllerBase.Problem een ProblemDetails antwoord gemaakt:
[HttpGet("Error")]
public IActionResult GetError() =>
Problem("Something went wrong.");
Een ProblemDetails
antwoord is altijd camelCase, zelfs wanneer de app de indeling instelt op PascalCase.
ProblemDetails
volgt RFC 7807, dat kleine letters aangeeft.
Als u uitvoerserialisatieopties voor specifieke acties wilt configureren, gebruikt u JsonResult
. For example:
[HttpGet]
public IActionResult Get() =>
new JsonResult(
_todoItemStore.GetList(),
new JsonSerializerOptions
{
PropertyNamingPolicy = null
});
Ondersteuning voor JSON-indeling toevoegen Newtonsoft.Json
De standaard JSON-formatters gebruiken System.Text.Json
. Als u de Newtonsoft.Json
op -gebaseerde formatters wilt gebruiken, installeert u het Microsoft.AspNetCore.Mvc.NewtonsoftJson
NuGet-pakket en configureert u het in Program.cs
:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers()
.AddNewtonsoftJson();
In de voorgaande code configureert de aanroep om de volgende web-API-, MVC- en Pages-functies te AddNewtonsoftJson
configureren voor gebruikNewtonsoft.Json
:Razor
- Invoer- en uitvoerindelingen die JSON lezen en schrijven
- JsonResult
- JSON Patch
- IJsonHelper
- TempData
Sommige functies werken mogelijk niet goed met System.Text.Json
formatters op basis van -en vereisen een verwijzing naar de Newtonsoft.Json
op -gebaseerde formatters. Blijf de Newtonsoft.Json
op -gebaseerde formatters gebruiken wanneer de app:
- Maakt gebruik van
Newtonsoft.Json
kenmerken. Een voorbeeld hiervan is[JsonProperty]
of[JsonIgnore]
. - Hiermee past u de serialisatie-instellingen aan.
- Is afhankelijk van functies die
Newtonsoft.Json
bieden.
Als u functies voor de Newtonsoft.Json
op -gebaseerde formatters wilt configureren, gebruikt u SerializerSettings:
builder.Services.AddControllers()
.AddNewtonsoftJson(options =>
{
options.SerializerSettings.ContractResolver = new DefaultContractResolver();
});
Als u uitvoerserialisatieopties voor specifieke acties wilt configureren, gebruikt u JsonResult
. For example:
[HttpGet]
public IActionResult GetNewtonsoftJson() =>
new JsonResult(
_todoItemStore.GetList(),
new JsonSerializerSettings
{
ContractResolver = new DefaultContractResolver()
});
Een indeling opgeven
Als u de antwoordindelingen wilt beperken, past u het [Produces]
filter toe. Net als bij de meeste filters[Produces]
kunt u deze toepassen op de actie, controller of globaal bereik:
[ApiController]
[Route("api/[controller]")]
[Produces("application/json")]
public class TodoItemsController : ControllerBase
Het voorgaande [Produces]
filter:
- Dwingt alle acties binnen de controller af om JSON-geformatteerde antwoorden te retourneren voor POCOs (gewone oude CLR-objecten) of ObjectResult de afgeleide typen.
- Retourneer JSON-opgemaakte antwoorden, zelfs als andere formatters zijn geconfigureerd en de client een andere indeling opgeeft.
Zie Filters voor meer informatie.
Speciale case formatters
Sommige speciale gevallen worden geïmplementeerd met behulp van ingebouwde formatters.
string
Standaard worden retourtypen opgemaakt als tekst/tekst zonder opmaak (tekst/html indien aangevraagd via de Accept
koptekst). Dit gedrag kan worden verwijderd door de StringOutputFormatter. Formatters worden verwijderd in Program.cs
. Acties met een retourtype modelobject retourneren wanneer ze worden geretourneerd 204 No Content
null
. Dit gedrag kan worden verwijderd door de HttpNoContentOutputFormatter. Met de volgende code worden de StringOutputFormatter
en HttpNoContentOutputFormatter
.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers(options =>
{
// using Microsoft.AspNetCore.Mvc.Formatters;
options.OutputFormatters.RemoveType<StringOutputFormatter>();
options.OutputFormatters.RemoveType<HttpNoContentOutputFormatter>();
});
Zonder de StringOutputFormatter
, de ingebouwde JSON formatter formatter formats retourneert string
typen. Als de ingebouwde JSON-indeling wordt verwijderd en er een XML-formatter beschikbaar is, retourneert de XML-formatter-indelingen string
typen.
string
Anders retourneren 406 Not Acceptable
retourtypen.
Zonder de HttpNoContentOutputFormatter
notatie worden null-objecten opgemaakt met behulp van de geconfigureerde formatter. For example:
- De JSON-formatter retourneert een antwoord met een hoofdtekst van
null
. - De XML-formatter retourneert een leeg XML-element met de kenmerkset
xsi:nil="true"
.
URL-toewijzingen voor antwoordindeling
Clients kunnen een bepaalde indeling aanvragen als onderdeel van de URL, bijvoorbeeld:
- In de querytekenreeks of een deel van het pad.
- Door een indelingsspecifieke bestandsextensie te gebruiken, zoals .xml of .json.
De toewijzing van het aanvraagpad moet worden opgegeven in de route die de API gebruikt. For example:
[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);
Met de voorgaande route kan de aangevraagde indeling worden opgegeven met behulp van een optionele bestandsextensie. Het [FormatFilter]
kenmerk controleert op het bestaan van de notatiewaarde in de RouteData
en wijst de antwoordindeling toe aan de juiste notatie wanneer het antwoord wordt gemaakt.
Route | Formatter |
---|---|
/api/todoitems/5 |
De standaarduitvoerindeling |
/api/todoitems/5.json |
De JSON-formatter (indien geconfigureerd) |
/api/todoitems/5.xml |
De XML-indeling (indien geconfigureerd) |
Polymorphic deserialization
Ingebouwde functies bieden een beperkt scala aan polymorfische serialisatie, maar helemaal geen ondersteuning voor deserialisatie. Voor deserialisatie is een aangepast conversieprogramma vereist. Zie Polymorfische deserialisatie voor een volledig voorbeeld van polymorfische deserialisatie.
Additional resources
ASP.NET Core MVC biedt ondersteuning voor het opmaken van antwoordgegevens. Antwoordgegevens kunnen worden opgemaakt met behulp van specifieke indelingen of als reactie op de aangevraagde indeling van de client.
Voorbeeldcode bekijken of downloaden (hoe download je)
Opmaakspecifieke actieresultaten
Sommige typen actieresultaten zijn specifiek voor een bepaalde indeling, zoals JsonResult en ContentResult. Acties kunnen resultaten retourneren die zijn opgemaakt in een bepaalde indeling, ongeacht de clientvoorkeuren. Retourneert bijvoorbeeld JsonResult
JSON-geformatteerde gegevens. Retourneert ContentResult
of een tekenreeks retourneert tekenreeksgegevens met tekst zonder opmaak.
Een actie is niet vereist om een specifiek type te retourneren. ASP.NET Core ondersteunt elke retourwaarde van objecten. Resultaten van acties die objecten retourneren die geen IActionResult typen zijn, worden geserialiseerd met behulp van de juiste IOutputFormatter implementatie. Zie Retourtypen controlleractie in ASP.NET Core-web-API voor meer informatie.
De ingebouwde helpermethode Ok retourneert JSON-geformatteerde gegevens:
// GET: api/authors
[HttpGet]
public ActionResult Get()
{
return Ok(_authors.List());
}
De voorbeelddownload retourneert de lijst met auteurs. Gebruik de ontwikkelhulpprogramma's van de F12-browser of http-repl met de vorige code:
- De antwoordheader met het inhoudstype:
application/json; charset=utf-8
wordt weergegeven. - De aanvraagheaders worden weergegeven. Bijvoorbeeld de
Accept
koptekst. DeAccept
header wordt genegeerd door de voorgaande code.
Als u opgemaakte gegevens zonder opmaak wilt retourneren, gebruikt ContentResult u en de Content helper:
// GET api/authors/about
[HttpGet("About")]
public ContentResult About()
{
return Content("An API listing authors of docs.asp.net.");
}
In de voorgaande code is text/plain
de Content-Type
geretourneerde waarde. Retourneert een tekenreeks van Content-Type
text/plain
:
// GET api/authors/version
[HttpGet("version")]
public string Version()
{
return "Version 1.0.0";
}
Voor acties met meerdere retourtypen, retour IActionResult
. Bijvoorbeeld het retourneren van verschillende HTTP-statuscodes op basis van het resultaat van uitgevoerde bewerkingen.
Content negotiation
Inhoudsonderhandeling vindt plaats wanneer de client een Accept-header opgeeft. De standaardindeling die wordt gebruikt door ASP.NET Core is JSON. Inhoudsonderhandeling is:
- Geïmplementeerd door ObjectResult.
- Ingebouwd in de statuscodespecifieke actieresultaten die worden geretourneerd door de helpermethoden. De helpermethoden voor actieresultaten zijn gebaseerd op
ObjectResult
.
Wanneer een modeltype wordt geretourneerd, is ObjectResult
het retourtype.
De volgende actiemethode maakt gebruik van de Ok
en NotFound
helpermethoden:
// 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);
}
Standaard ondersteunt application/json
text/json
ASP.NET Core mediatypen en text/plain
mediatypen. Hulpprogramma's zoals Fiddler of http-repl kunnen de Accept
aanvraagheader instellen om de retourindeling op te geven. Wanneer de Accept
header een type bevat dat door de server wordt ondersteund, wordt dat type geretourneerd. In de volgende sectie ziet u hoe u extra formatters toevoegt.
Controlleracties kunnen POCO's (gewone oude CLR-objecten) retourneren. Wanneer een POCO wordt geretourneerd, maakt de runtime automatisch een ObjectResult
object dat het object verpakt. De client haalt het opgemaakte geserialiseerde object op. Als het geretourneerde object is null
, wordt er een 204 No Content
antwoord geretourneerd.
Een objecttype retourneren:
// GET api/authors/RickAndMSFT
[HttpGet("{alias}")]
public Author Get(string alias)
{
return _authors.GetByAlias(alias);
}
In de voorgaande code retourneert een aanvraag voor een geldige auteursalias een 200 OK
antwoord met de gegevens van de auteur. Een aanvraag voor een ongeldige alias retourneert een 204 No Content
antwoord.
De kopTekst Accepteren
Inhoudsonderhandeling vindt plaats wanneer er een Accept
header wordt weergegeven in de aanvraag. Wanneer een aanvraag een acceptheader bevat, ASP.NET Core:
- Opsomming van de mediatypen in de accept-header in voorkeursvolgorde.
- Hiermee wordt geprobeerd een formatter te vinden die een antwoord kan produceren in een van de opgegeven indelingen.
Als er geen formatter wordt gevonden die aan de aanvraag van de client kan voldoen, ASP.NET Core:
- Retourneert
406 Not Acceptable
als MvcOptions.ReturnHttpNotAcceptable deze is ingesteld optrue
, of - - Hiermee wordt geprobeerd de eerste formatter te vinden die een antwoord kan produceren.
Als er geen formatter is geconfigureerd voor de aangevraagde indeling, wordt de eerste formatter gebruikt waarmee het object kan worden opgemaakt. Als er geen Accept
header wordt weergegeven in de aanvraag:
- De eerste formatter die het object kan verwerken, wordt gebruikt om het antwoord te serialiseren.
- Er vindt geen onderhandeling plaats. De server bepaalt welke indeling moet worden geretourneerd.
Als de kopTekst Accepteren bevat */*
, wordt de koptekst genegeerd, tenzij RespectBrowserAcceptHeader
deze is ingesteld op waar op MvcOptions.
Browsers en inhoudsonderhandeling
In tegenstelling tot typische API-clients leveren Accept
webbrowsers headers. Webbrowsers geven veel indelingen op, waaronder jokertekens. Wanneer het framework standaard detecteert dat de aanvraag afkomstig is van een browser:
- De
Accept
koptekst wordt genegeerd. - De inhoud wordt geretourneerd in JSON, tenzij anders geconfigureerd.
Deze benadering biedt een consistentere ervaring in browsers bij het gebruik van API's.
Als u een app wilt configureren voor het accepteren van headers in de browser, stelt u het volgende in RespectBrowserAcceptHeadertrue
:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers(options =>
{
options.RespectBrowserAcceptHeader = true; // false by default
});
}
Configure formatters
Apps die aanvullende indelingen moeten ondersteunen, kunnen de juiste NuGet-pakketten toevoegen en ondersteuning configureren. Er zijn afzonderlijke formatters voor invoer en uitvoer. Invoerindelingen worden gebruikt door Modelbinding. Uitvoerindelingen worden gebruikt om antwoorden op te maken. Zie Custom Formatters voor meer informatie over het maken van een aangepaste formatter.
Ondersteuning voor XML-indeling toevoegen
XML-formatters die zijn geïmplementeerd met behulp XmlSerializer van, worden geconfigureerd door het aanroepen AddXmlSerializerFormattersvan:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers()
.AddXmlSerializerFormatters();
}
De voorgaande code serialiseert resultaten met behulp van XmlSerializer
.
Wanneer u de voorgaande code gebruikt, retourneren controllermethoden de juiste indeling op basis van de header van Accept
de aanvraag.
Op basis van formatters configureren System.Text.Json
Functies voor de System.Text.Json
gebaseerde formatters kunnen worden geconfigureerd met behulp van Microsoft.AspNetCore.Mvc.JsonOptions.JsonSerializerOptions. De standaardopmaak is camelCase. Met de volgende gemarkeerde code wordt de PascalCase-opmaak ingesteld:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers()
.AddJsonOptions(options =>
options.JsonSerializerOptions.PropertyNamingPolicy = null);
}
Met de volgende actiemethode wordt ControllerBase.Problem een ProblemDetails antwoord gemaakt:
[HttpGet("error")]
public IActionResult GetError()
{
return Problem("Something went wrong!");
}
Met de voorgaande code:
-
https://localhost:5001/WeatherForecast/temperature
retourneert PascalCase. -
https://localhost:5001/WeatherForecast/error
retourneert camelCase. De foutreactie is altijd camelCase, zelfs wanneer de app de indeling instelt op PascalCase.ProblemDetails
volgt RFC 7807, dat kleine letters aangeeft
Met de volgende code wordt PascalCase ingesteld en wordt een aangepast conversieprogramma toegevoegd:
services.AddControllers().AddJsonOptions(options =>
{
// Use the default property (Pascal) casing.
options.JsonSerializerOptions.PropertyNamingPolicy = null;
// Configure a custom converter.
options.JsonSerializerOptions.Converters.Add(new MyCustomJsonConverter());
});
Uitvoerserialisatieopties kunnen per actie worden geconfigureerd met behulp van JsonResult
. For example:
public IActionResult Get()
{
return Json(model, new JsonSerializerOptions
{
WriteIndented = true,
});
}
Ondersteuning voor JSON-indeling op basis van Newtonsoft.Json toevoegen
De standaard JSON-formatters zijn gebaseerd op System.Text.Json
. Ondersteuning voor Newtonsoft.Json
op gebaseerde formatters en functies is beschikbaar door het Microsoft.AspNetCore.Mvc.NewtonsoftJson
NuGet-pakket te installeren en in Startup.ConfigureServices
te configureren.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers()
.AddNewtonsoftJson();
}
In de voorgaande code configureert de aanroep om de volgende web-API-, MVC- en Pages-functies te AddNewtonsoftJson
configureren voor gebruikNewtonsoft.Json
:Razor
- Invoer- en uitvoerindelingen die JSON lezen en schrijven
- JsonResult
- JSON Patch
- IJsonHelper
- TempData
Sommige functies werken mogelijk niet goed met System.Text.Json
formatters op basis van -en vereisen een verwijzing naar de Newtonsoft.Json
op -gebaseerde formatters. Blijf de Newtonsoft.Json
op -gebaseerde formatters gebruiken wanneer de app:
- Maakt gebruik van
Newtonsoft.Json
kenmerken. Een voorbeeld hiervan is[JsonProperty]
of[JsonIgnore]
. - Hiermee past u de serialisatie-instellingen aan.
- Is afhankelijk van functies die
Newtonsoft.Json
bieden.
Functies voor de Newtonsoft.Json
op -gebaseerde formatters kunnen worden geconfigureerd met behulp van Microsoft.AspNetCore.Mvc.MvcNewtonsoftJsonOptions.SerializerSettings
:
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());
});
Uitvoerserialisatieopties kunnen per actie worden geconfigureerd met behulp van JsonResult
. For example:
public IActionResult Get()
{
return Json(model, new JsonSerializerSettings
{
Formatting = Formatting.Indented,
});
}
Een indeling opgeven
Als u de antwoordindelingen wilt beperken, past u het [Produces]
filter toe. Net als bij de meeste filters[Produces]
kunt u deze toepassen op de actie, controller of globaal bereik:
[ApiController]
[Route("[controller]")]
[Produces("application/json")]
public class WeatherForecastController : ControllerBase
{
Het voorgaande [Produces]
filter:
- Dwingt alle acties binnen de controller af om JSON-geformatteerde antwoorden te retourneren voor POCOs (gewone oude CLR-objecten) of ObjectResult de afgeleide typen.
- Als andere formatters zijn geconfigureerd en de client een andere indeling opgeeft, wordt JSON geretourneerd.
Zie Filters voor meer informatie.
Speciale case formatters
Sommige speciale gevallen worden geïmplementeerd met behulp van ingebouwde formatters.
string
Standaard worden retourtypen opgemaakt als tekst/tekst zonder opmaak (tekst/html indien aangevraagd via de Accept
koptekst). Dit gedrag kan worden verwijderd door de StringOutputFormatter. Formatters worden verwijderd in de ConfigureServices
methode. Acties met een retourtype modelobject retourneren wanneer ze worden geretourneerd 204 No Content
null
. Dit gedrag kan worden verwijderd door de HttpNoContentOutputFormatter. Met de volgende code worden de StringOutputFormatter
en HttpNoContentOutputFormatter
.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers(options =>
{
// requires using Microsoft.AspNetCore.Mvc.Formatters;
options.OutputFormatters.RemoveType<StringOutputFormatter>();
options.OutputFormatters.RemoveType<HttpNoContentOutputFormatter>();
});
}
Zonder de StringOutputFormatter
, de ingebouwde JSON formatter formatter formats retourneert string
typen. Als de ingebouwde JSON-indeling wordt verwijderd en er een XML-formatter beschikbaar is, retourneert de XML-formatter-indelingen string
typen.
string
Anders retourneren 406 Not Acceptable
retourtypen.
Zonder de HttpNoContentOutputFormatter
notatie worden null-objecten opgemaakt met behulp van de geconfigureerde formatter. For example:
- De JSON-formatter retourneert een antwoord met een hoofdtekst van
null
. - De XML-formatter retourneert een leeg XML-element met de kenmerkset
xsi:nil="true"
.
URL-toewijzingen voor antwoordindeling
Clients kunnen een bepaalde indeling aanvragen als onderdeel van de URL, bijvoorbeeld:
- In de querytekenreeks of een deel van het pad.
- Door een indelingsspecifieke bestandsextensie te gebruiken, zoals .xml of .json.
De toewijzing van het aanvraagpad moet worden opgegeven in de route die de API gebruikt. For example:
[Route("api/[controller]")]
[ApiController]
[FormatFilter]
public class ProductsController : ControllerBase
{
[HttpGet("{id}.{format?}")]
public Product Get(int id)
{
Met de voorgaande route kan de aangevraagde indeling worden opgegeven als een optionele bestandsextensie. Het [FormatFilter]
kenmerk controleert op het bestaan van de notatiewaarde in de RouteData
en wijst de antwoordindeling toe aan de juiste notatie wanneer het antwoord wordt gemaakt.
Route | Formatter |
---|---|
/api/products/5 |
De standaarduitvoerindeling |
/api/products/5.json |
De JSON-formatter (indien geconfigureerd) |
/api/products/5.xml |
De XML-indeling (indien geconfigureerd) |
ASP.NET Core MVC ondersteunt het opmaken van antwoordgegevens, met behulp van opgegeven indelingen of in reactie op de aanvraag van een client.
Opmaakspecifieke actieresultaten
Sommige typen actieresultaten zijn specifiek voor een bepaalde indeling, zoals JsonResult en ContentResult. Acties kunnen resultaten retourneren die altijd een opgegeven indeling gebruiken, waarbij de aanvraag van een client voor een andere indeling wordt genegeerd. Als u bijvoorbeeld JsonResult
JSON-geformatteerde gegevens retourneert en ContentResult
tekenreeksgegevens zonder opmaak retourneert.
Een actie is niet vereist om een specifiek type te retourneren. ASP.NET Core ondersteunt elke retourwaarde van objecten. Resultaten van acties die objecten retourneren die geen IActionResult typen zijn, worden geserialiseerd met behulp van de juiste IOutputFormatter implementatie. Zie Retourtypen controlleractie in ASP.NET Core-web-API voor meer informatie.
Standaard retourneert de ingebouwde helpermethode ControllerBase.Ok JSON-geformatteerde gegevens:
[HttpGet]
public IActionResult Get()
=> Ok(_todoItemStore.GetList());
De voorbeeldcode retourneert een lijst met takenitems. Met behulp van de ontwikkelhulpprogramma's van de F12-browser of http-repl met de vorige code wordt het volgende weergegeven:
- De antwoordheader met inhoudstype:
application/json; charset=utf-8
. - De aanvraagheaders. Bijvoorbeeld de
Accept
koptekst. DeAccept
header wordt genegeerd door de voorgaande code.
Als u opgemaakte gegevens zonder opmaak wilt retourneren, gebruikt ContentResult u en de Content helper:
[HttpGet("Version")]
public ContentResult GetVersion()
=> Content("v1.0.0");
In de voorgaande code is text/plain
de Content-Type
geretourneerde waarde.
Voor acties met meerdere retourtypen, retour IActionResult
. Als u bijvoorbeeld verschillende HTTP-statuscodes retourneert op basis van het resultaat van de bewerking.
Content negotiation
Inhoudsonderhandeling vindt plaats wanneer de client een Accept-header opgeeft. De standaardindeling die wordt gebruikt door ASP.NET Core is JSON. Inhoudsonderhandeling is:
- Geïmplementeerd door ObjectResult.
- Ingebouwd in de statuscodespecifieke actieresultaten die worden geretourneerd door de helpermethoden. De helpermethoden voor actieresultaten zijn gebaseerd op
ObjectResult
.
Wanneer een modeltype wordt geretourneerd, is ObjectResult
het retourtype.
De volgende actiemethode maakt gebruik van de Ok
en NotFound
helpermethoden:
[HttpGet("{id:long}")]
public IActionResult GetById(long id)
{
var todo = _todoItemStore.GetById(id);
if (todo is null)
{
return NotFound();
}
return Ok(todo);
}
Standaard ondersteunt ASP.NET Core de volgende mediatypen:
application/json
text/json
text/plain
Hulpprogramma's zoals Fiddler of http-repl kunnen de Accept
aanvraagheader instellen om de retourindeling op te geven. Wanneer de Accept
header een type bevat dat door de server wordt ondersteund, wordt dat type geretourneerd. In de volgende sectie ziet u hoe u extra formatters toevoegt.
Controlleracties kunnen POCO's (gewone oude CLR-objecten) retourneren. Wanneer een POCO wordt geretourneerd, maakt de runtime automatisch een ObjectResult
object dat het object verpakt. De client haalt het opgemaakte geserialiseerde object op. Als het geretourneerde object is null
, wordt er een 204 No Content
antwoord geretourneerd.
In het volgende voorbeeld wordt een objecttype geretourneerd:
[HttpGet("{id:long}")]
public TodoItem? GetById(long id)
=> _todoItemStore.GetById(id);
In de voorgaande code retourneert een aanvraag voor een geldig todo-item een 200 OK
antwoord. Een aanvraag voor een ongeldig taakitem retourneert een 204 No Content
antwoord.
De kopTekst Accepteren
Inhoudsonderhandeling vindt plaats wanneer er een Accept
header wordt weergegeven in de aanvraag. Wanneer een aanvraag een acceptheader bevat, ASP.NET Core:
- Opsomming van de mediatypen in de accept-header in voorkeursvolgorde.
- Hiermee wordt geprobeerd een formatter te vinden die een antwoord kan produceren in een van de opgegeven indelingen.
Als er geen formatter wordt gevonden die aan de aanvraag van de client kan voldoen, ASP.NET Core:
- Retourneert
406 Not Acceptable
als MvcOptions.ReturnHttpNotAcceptable deze is ingesteld optrue
, of - - Hiermee wordt geprobeerd de eerste formatter te vinden die een antwoord kan produceren.
Als er geen formatter is geconfigureerd voor de aangevraagde indeling, wordt de eerste formatter gebruikt waarmee het object kan worden opgemaakt. Als er geen Accept
header wordt weergegeven in de aanvraag:
- De eerste formatter die het object kan verwerken, wordt gebruikt om het antwoord te serialiseren.
- Er vindt geen onderhandeling plaats. De server bepaalt welke indeling moet worden geretourneerd.
Als de kopTekst Accepteren bevat */*
, wordt de koptekst genegeerd, tenzij RespectBrowserAcceptHeader
deze is ingesteld op waar op MvcOptions.
Browsers en inhoudsonderhandeling
In tegenstelling tot typische API-clients leveren Accept
webbrowsers headers. Webbrowsers geven veel indelingen op, waaronder jokertekens. Wanneer het framework standaard detecteert dat de aanvraag afkomstig is van een browser:
- De
Accept
koptekst wordt genegeerd. - De inhoud wordt geretourneerd in JSON, tenzij anders geconfigureerd.
Deze benadering biedt een consistentere ervaring in browsers bij het gebruik van API's.
Als u een app wilt configureren voor het respecteren van browserheaders, stelt u de RespectBrowserAcceptHeader eigenschap true
in op:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers(options =>
{
options.RespectBrowserAcceptHeader = true;
});
Configure formatters
Apps die extra indelingen moeten ondersteunen, kunnen de juiste NuGet-pakketten toevoegen en ondersteuning configureren. Er zijn afzonderlijke formatters voor invoer en uitvoer. Invoerindelingen worden gebruikt door Modelbinding. Uitvoerindelingen worden gebruikt om antwoorden op te maken. Zie Custom Formatters voor meer informatie over het maken van een aangepaste formatter.
Ondersteuning voor XML-indeling toevoegen
Als u XML-formatters wilt configureren die zijn geïmplementeerd met behulp van XmlSerializer, roept u het volgende AddXmlSerializerFormattersaan:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers()
.AddXmlSerializerFormatters();
Wanneer u de voorgaande code gebruikt, retourneren controllermethoden de juiste indeling op basis van de header van Accept
de aanvraag.
Op -gebaseerde formatters configureren System.Text.Json
Als u functies voor de System.Text.Json
op -gebaseerde formatters wilt configureren, gebruikt u Microsoft.AspNetCore.Mvc.JsonOptions.JsonSerializerOptions. Met de volgende gemarkeerde code wordt PascalCase-opmaak geconfigureerd in plaats van de standaardopmaak van camelCase:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers()
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.PropertyNamingPolicy = null;
});
Als u uitvoerserialisatieopties voor specifieke acties wilt configureren, gebruikt u JsonResult. For example:
[HttpGet]
public IActionResult Get()
=> new JsonResult(
_todoItemStore.GetList(),
new JsonSerializerOptions { PropertyNamingPolicy = null });
Ondersteuning voor JSON-indeling toevoegen Newtonsoft.Json
De standaard JSON-formatters gebruiken System.Text.Json
. Als u de Newtonsoft.Json
op -gebaseerde formatters wilt gebruiken, installeert u het Microsoft.AspNetCore.Mvc.NewtonsoftJson
NuGet-pakket en configureert u het in Program.cs
:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers()
.AddNewtonsoftJson();
In de voorgaande code configureert de aanroep om de volgende web-API-, MVC- en Pages-functies te AddNewtonsoftJson
configureren voor gebruikNewtonsoft.Json
:Razor
- Invoer- en uitvoerindelingen die JSON lezen en schrijven
- JsonResult
- JSON Patch
- IJsonHelper
- TempData
Sommige functies werken mogelijk niet goed met System.Text.Json
formatters op basis van -en vereisen een verwijzing naar de Newtonsoft.Json
op -gebaseerde formatters. Blijf de Newtonsoft.Json
op -gebaseerde formatters gebruiken wanneer de app:
- Maakt gebruik van
Newtonsoft.Json
kenmerken. Een voorbeeld hiervan is[JsonProperty]
of[JsonIgnore]
. - Hiermee past u de serialisatie-instellingen aan.
- Is afhankelijk van functies die
Newtonsoft.Json
bieden.
Als u functies voor de Newtonsoft.Json
op -gebaseerde formatters wilt configureren, gebruikt u SerializerSettings:
builder.Services.AddControllers()
.AddNewtonsoftJson(options =>
{
options.SerializerSettings.ContractResolver = new DefaultContractResolver();
});
Als u uitvoerserialisatieopties voor specifieke acties wilt configureren, gebruikt u JsonResult
. For example:
[HttpGet]
public IActionResult GetNewtonsoftJson()
=> new JsonResult(
_todoItemStore.GetList(),
new JsonSerializerSettings { ContractResolver = new DefaultContractResolver() });
Opmaak ProblemDetails
en ValidationProblemDetails
antwoorden
Met de volgende actiemethode wordt ControllerBase.Problem een ProblemDetails antwoord gemaakt:
[HttpGet("Error")]
public IActionResult GetError()
=> Problem("Something went wrong.");
Een ProblemDetails
antwoord is altijd camelCase, zelfs wanneer de app de indeling instelt op PascalCase.
ProblemDetails
volgt RFC 7807, dat kleine letters aangeeft.
Wanneer het [ApiController]
kenmerk wordt toegepast op een controllerklasse, maakt de controller een ValidationProblemDetails antwoord wanneer modelvalidatie mislukt. Dit antwoord bevat een woordenlijst die de eigenschapsnamen van het model gebruikt als foutsleutels, ongewijzigd. Het volgende model bevat bijvoorbeeld één eigenschap waarvoor validatie is vereist:
public class SampleModel
{
[Range(1, 10)]
public int Value { get; set; }
}
Het antwoord dat wordt geretourneerd wanneer de Value
eigenschap ongeldig is, ValidationProblemDetails
gebruikt standaard een foutsleutel van Value
, zoals wordt weergegeven in het volgende voorbeeld:
{
"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."
]
}
}
Als u de eigenschapsnamen wilt opmaken die worden gebruikt als foutsleutels, voegt u een implementatie van IMetadataDetailsProvider de MvcOptions.ModelMetadataDetailsProviders verzameling toe. In het volgende voorbeeld wordt een System.Text.Json
implementatie op basis van een indeling toegevoegd, SystemTextJsonValidationMetadataProvider
waarmee eigenschapsnamen standaard worden opgemaakt als camelCase:
builder.Services.AddControllers();
builder.Services.Configure<MvcOptions>(options =>
{
options.ModelMetadataDetailsProviders.Add(
new SystemTextJsonValidationMetadataProvider());
});
SystemTextJsonValidationMetadataProvider
accepteert ook een implementatie van in de constructor, waarmee een aangepast naamgevingsbeleid wordt opgegeven voor het opmaken van JsonNamingPolicy eigenschapsnamen.
Als u een aangepaste naam voor een eigenschap in een model wilt instellen, gebruikt u het kenmerk [JsonPropertyName] op de eigenschap:
public class SampleModel
{
[Range(1, 10)]
[JsonPropertyName("sampleValue")]
public int Value { get; set; }
}
Het ValidationProblemDetails
antwoord dat is geretourneerd voor het voorgaande model wanneer de Value
eigenschap ongeldig is, gebruikt een foutsleutel van sampleValue
, zoals wordt weergegeven in het volgende voorbeeld:
{
"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."
]
}
}
Als u het ValidationProblemDetails
antwoord wilt opmaken met behulp van Newtonsoft.Json
, gebruikt u NewtonsoftJsonValidationMetadataProvider
:
builder.Services.AddControllers()
.AddNewtonsoftJson();
builder.Services.Configure<MvcOptions>(options =>
{
options.ModelMetadataDetailsProviders.Add(
new NewtonsoftJsonValidationMetadataProvider());
});
NewtonsoftJsonValidationMetadataProvider
Standaard worden eigenschapsnamen opgemaakt als camelCase.
NewtonsoftJsonValidationMetadataProvider
accepteert ook een implementatie van in de constructor, waarmee een aangepast naamgevingsbeleid wordt opgegeven voor het opmaken van NamingPolicy
eigenschapsnamen. Als u een aangepaste naam voor een eigenschap in een model wilt instellen, gebruikt u het [JsonProperty]
kenmerk.
Een indeling opgeven
Als u de antwoordindelingen wilt beperken, past u het [Produces]
filter toe. Net als bij de meeste filters[Produces]
kunt u deze toepassen op de actie, controller of globaal bereik:
[ApiController]
[Route("api/[controller]")]
[Produces("application/json")]
public class TodoItemsController : ControllerBase
Het voorgaande [Produces]
filter:
- Dwingt alle acties binnen de controller af om JSON-geformatteerde antwoorden te retourneren voor POCOs (gewone oude CLR-objecten) of ObjectResult de afgeleide typen.
- Retourneer JSON-opgemaakte antwoorden, zelfs als andere formatters zijn geconfigureerd en de client een andere indeling opgeeft.
Zie Filters voor meer informatie.
Speciale case formatters
Sommige speciale gevallen worden geïmplementeerd met behulp van ingebouwde formatters.
string
Standaard worden retourtypen opgemaakt als tekst/tekst zonder opmaak (tekst/html indien aangevraagd via de Accept
koptekst). Dit gedrag kan worden verwijderd door de StringOutputFormatter. Formatters worden verwijderd in Program.cs
. Acties met een retourtype modelobject retourneren wanneer ze worden geretourneerd 204 No Content
null
. Dit gedrag kan worden verwijderd door de HttpNoContentOutputFormatter. Met de volgende code worden de StringOutputFormatter
en HttpNoContentOutputFormatter
.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers(options =>
{
// using Microsoft.AspNetCore.Mvc.Formatters;
options.OutputFormatters.RemoveType<StringOutputFormatter>();
options.OutputFormatters.RemoveType<HttpNoContentOutputFormatter>();
});
Zonder de StringOutputFormatter
, de ingebouwde JSON formatter formatter formats retourneert string
typen. Als de ingebouwde JSON-indeling wordt verwijderd en er een XML-formatter beschikbaar is, retourneert de XML-formatter-indelingen string
typen.
string
Anders retourneren 406 Not Acceptable
retourtypen.
Zonder de HttpNoContentOutputFormatter
notatie worden null-objecten opgemaakt met behulp van de geconfigureerde formatter. For example:
- De JSON-formatter retourneert een antwoord met een hoofdtekst van
null
. - De XML-formatter retourneert een leeg XML-element met de kenmerkset
xsi:nil="true"
.
URL-toewijzingen voor antwoordindeling
Clients kunnen een bepaalde indeling aanvragen als onderdeel van de URL, bijvoorbeeld:
- In de querytekenreeks of een deel van het pad.
- Door een indelingsspecifieke bestandsextensie te gebruiken, zoals .xml of .json.
De toewijzing van het aanvraagpad moet worden opgegeven in de route die de API gebruikt. For example:
[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);
Met de voorgaande route kan de aangevraagde indeling worden opgegeven met behulp van een optionele bestandsextensie. Het [FormatFilter]
kenmerk controleert op het bestaan van de notatiewaarde in de RouteData
en wijst de antwoordindeling toe aan de juiste notatie wanneer het antwoord wordt gemaakt.
Route | Formatter |
---|---|
/api/todoitems/5 |
De standaarduitvoerindeling |
/api/todoitems/5.json |
De JSON-formatter (indien geconfigureerd) |
/api/todoitems/5.xml |
De XML-indeling (indien geconfigureerd) |
Polymorphic deserialization
Ingebouwde functies bieden een beperkt scala aan polymorfische serialisatie, maar helemaal geen ondersteuning voor deserialisatie. Voor deserialisatie is een aangepast conversieprogramma vereist. Zie Polymorfische deserialisatie voor een volledig voorbeeld van polymorfische deserialisatie.