Megosztás a következőn keresztül:


Webes API-k létrehozása a ASP.NET Core használatával

ASP.NET Core támogatja a webes API-k vezérlőkkel vagy minimális API-k használatával történő létrehozását. A webes API-k vezérlői olyan osztályok, amelyek a következőből ControllerBaseszármaznak: . A vezérlők aktiválása és megsemmisítése kérésenként történik.

Ez a cikk bemutatja, hogyan használhat vezérlőket a webes API-kérések kezeléséhez. A webes API-k vezérlők nélküli létrehozásáról a következő oktatóanyagban olvashat: Minimális API létrehozása ASP.NET Core használatával.

Fontos

A ASP.NET Core 10-től kezdve az ismert API-végpontok már nem lesznek átirányítva a bejelentkezési lapokra hitelesítés használatakor cookie . Ehelyett 401/403 állapotkódokat adnak vissza. További részletekért lásd az API-végpontok hitelesítési viselkedését a ASP.NET Core-ban.

ControllerBase-osztály

A vezérlőalapú webes API egy vagy több vezérlőosztályból áll, amelyek ControllerBaseszármaznak. A webes API-projektsablon egy kezdővezérlőt biztosít:

[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase

A webes API-vezérlőknek általában a ControllerBase-ból kell származniuk, nem pedig a Controller-ből. Controller ControllerBase származik, és támogatja a nézeteket, így a weblapok kezelésére szolgál, nem a webes API-kérelmekre. Ha ugyanannak a vezérlőnek támogatnia kell a nézeteket és a webes API-kat, akkor a következőből Controllerszármazik: .

A ControllerBase osztály számos olyan tulajdonságot és metódust biztosít, amelyek hasznosak a HTTP-kérések kezeléséhez. Például a CreatedAtAction egy 201-es állapotkódot ad vissza.

[HttpPost]
[ProducesResponseType(StatusCodes.Status201Created)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
public ActionResult<Pet> Create(Pet pet)
{
    pet.Id = _petsInMemoryStore.Any() ? 
             _petsInMemoryStore.Max(p => p.Id) + 1 : 1;
    _petsInMemoryStore.Add(pet);

    return CreatedAtAction(nameof(GetById), new { id = pet.Id }, pet);
}

Az alábbi táblázat példákat tartalmaz a metódusokra a következőben ControllerBase: .

Method Notes
BadRequest 400 állapotkódot ad vissza.
NotFound 404-es állapotkódot ad vissza.
PhysicalFile Egy fájlt ad vissza.
TryUpdateModelAsync Modellkötés meghívása.
TryValidateModel Modellérvényesítést hív meg.

Az összes elérhető metódus és tulajdonság listáját lásd ControllerBase: .

Attributes

A Microsoft.AspNetCore.Mvc névtér olyan attribútumokat biztosít, amelyek a webes API-vezérlők és műveleti módszerek viselkedésének konfigurálására használhatók. Az alábbi példa attribútumokkal adja meg a támogatott HTTP-műveleti parancsot és az esetlegesen visszaadható ismert HTTP-állapotkódokat:

[HttpPost]
[ProducesResponseType(StatusCodes.Status201Created)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
public ActionResult<Pet> Create(Pet pet)
{
    pet.Id = _petsInMemoryStore.Any() ? 
             _petsInMemoryStore.Max(p => p.Id) + 1 : 1;
    _petsInMemoryStore.Add(pet);

    return CreatedAtAction(nameof(GetById), new { id = pet.Id }, pet);
}

Íme néhány további példa az elérhető attribútumokra.

Attribute Notes
[Route] Egy vezérlő vagy művelet URL-mintázatát adja meg.
[Bind] Megadja a modellkötéshez felvenni kívánt előtagot és tulajdonságokat.
[HttpGet] A HTTP GET művelet igét támogató műveletet azonosít.
[Consumes] Megadja azokat az adattípusokat, amelyeket egy művelet elfogad.
[Produces] Megadja a művelet által visszaadott adattípusokat.

Az elérhető attribútumokat tartalmazó listákért tekintse meg a Microsoft.AspNetCore.Mvc névteret.

ApiController attribútum

Az [ApiController] attribútum egy vezérlőosztályra alkalmazható a következő véleményezett, API-specifikus viselkedések engedélyezéséhez:

Adott vezérlők attribútuma

Az [ApiController] attribútum adott vezérlőkre alkalmazható, ahogyan a projektsablon alábbi példájában is látható:

[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase

Attribútum több vezérlőn

Az attribútumot egynél több vezérlőn is használhatja, ha létrehoz egy egyéni alapvezérlőosztályt, amely az [ApiController] attribútummal van eljegyzve. Az alábbi példa egy egyéni alaposztályt és egy belőle származó vezérlőt mutat be:

[ApiController]
public class MyControllerBase : ControllerBase
{
}
[Produces(MediaTypeNames.Application.Json)]
[Route("[controller]")]
public class PetsController : MyControllerBase

Attribútum egy összeállításban

Az [ApiController] attribútum alkalmazható egy szerelvényre. Amikor az [ApiController] attribútumot egy szerelvényre alkalmazza, a szerelvény összes vezérlője alkalmazza az [ApiController] attribútumot. Az egyes vezérlők nem választhatók ki. Alkalmazza a szerelvényszintű attribútumot a Program.cs fájlra:

using Microsoft.AspNetCore.Mvc;
[assembly: ApiController]

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers();

var app = builder.Build();

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run();

Attribútum alapú útválasztás követelmény

Az [ApiController] attribútum követelménysé teszi az attribútum-útválasztást. Például:

[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase

A műveletek nem érhetők el a , UseEndpoints és UseMvc által meghatározott hagyományos útvonalakon keresztül.

Automatikus HTTP 400-válaszok

Az [ApiController] attribútum automatikusan elindít egy HTTP 400-választ a modellérvényesítési hibák miatt. Ezért a következő kód szükségtelen egy műveletmetódusban:

if (!ModelState.IsValid)
{
    return BadRequest(ModelState);
}

ASP.NET Core MVC a ModelStateInvalidFilter műveletszűrővel hajtja végre az előző ellenőrzést.

Alapértelmezett BadRequest-válasz

A HTTP 400-válaszok alapértelmezett választípusa a következő ValidationProblemDetails. A szerializált típusra az alábbi választörzs mutat példát:

{
  "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
  "title": "One or more validation errors occurred.",
  "status": 400,
  "traceId": "|7fb5e16a-4c8f23bbfc974667.",
  "errors": {
    "": [
      "A non-empty request body is required."
    ]
  }
}

A ValidationProblemDetails típus:

Az automatikus és egyéni válaszok konzisztenssé tétele érdekében a ValidationProblem metódust hívja meg ahelyett, hogy BadRequest. ValidationProblem objektumot ad vissza ValidationProblemDetails -ként, valamint az automatikus választ is.

Automatikus 400 válasz naplózása

Az automatikus 400 válasz naplózásához állítsa be a InvalidModelStateResponseFactory delegált tulajdonságot egyéni feldolgozásra. Alapértelmezés szerint InvalidModelStateResponseFactory a ProblemDetailsFactory létrehozásához a ValidationProblemDetails használja.

Az alábbi példa bemutatja, hogyan kérhető le egy ILogger<TCategoryName> példány, hogy naplózza egy automatikus 400-válasz adatait.

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers()
    .ConfigureApiBehaviorOptions(options =>
    {
      // To preserve the default behavior, capture the original delegate to call later.
        var builtInFactory = options.InvalidModelStateResponseFactory;

        options.InvalidModelStateResponseFactory = context =>
        {
            var logger = context.HttpContext.RequestServices
                                .GetRequiredService<ILogger<Program>>();

            // Perform logging here.
            // ...

            // Invoke the default behavior, which produces a ValidationProblemDetails
            // response.
            // To produce a custom response, return a different implementation of 
            // IActionResult instead.
            return builtInFactory(context);
        };
    });

var app = builder.Build();

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run();

Automatikus 400-válasz letiltása

Az automatikus 400 viselkedés letiltásához állítsa a SuppressModelStateInvalidFilter tulajdonságot a következőre: true. Adja hozzá a következő kiemelt kódot:

using Microsoft.AspNetCore.Mvc;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers()
    .ConfigureApiBehaviorOptions(options =>
    {
        options.SuppressConsumesConstraintForFormFileParameters = true;
        options.SuppressInferBindingSourcesForParameters = true;
        options.SuppressModelStateInvalidFilter = true;
        options.SuppressMapClientErrors = true;
        options.ClientErrorMapping[StatusCodes.Status404NotFound].Link =
            "https://httpstatuses.com/404";
    });

var app = builder.Build();

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run();

Kötés forrásparaméterének következtetése

A kötési forrásattribútum határozza meg azt a helyet, ahol egy műveleti paraméter értéke található. A következő kötési forrásattribútumok léteznek:

Attribute Kötés forrása
[FromBody] A kérés tartalma
[FromForm] Űrlap adat a kérelem törzsében
[FromHeader] Kérelem fejléce
[FromQuery] Lekérdezési sztring paraméter kérése
[FromRoute] Adatok átirányítása az aktuális kérelemből
[FromServices] A kérelemszolgáltatás műveletparaméterként injektálva
[AsParameters] Metódusparaméterek

Warning

Ne használja [FromRoute] , ha az értékek tartalmazhatnak %2f (azaz /). %2f nem lesz feloldva / formátumra. Akkor használja [FromQuery] , ha az érték tartalmazhat %2f.

Az ASP.NET Core futtatókörnyezet az [ApiController] vagy a kötési forrásattribútumok, mint [FromQuery], hiányában próbálja meg az összetett objektummodell-kötőt használni. Az összetett objektummodell-iratgyűjtő meghatározott sorrendben kér le adatokat az értékszolgáltatóktól.

Az alábbi példában az [FromQuery] attribútum azt jelzi, hogy a discontinuedOnly paraméter értéke a kérelem URL-címének lekérdezési sztringjében van megadva:

[HttpGet]
public ActionResult<List<Product>> Get(
    [FromQuery] bool discontinuedOnly = false)
{
    List<Product> products = null;

    if (discontinuedOnly)
    {
        products = _productsInMemoryStore.Where(p => p.IsDiscontinued).ToList();
    }
    else
    {
        products = _productsInMemoryStore;
    }

    return products;
}

Az [ApiController] attribútum következtetési szabályokat alkalmaz a műveleti paraméterek alapértelmezett adatforrásaira. Ezekkel a szabályokkal nem kell manuálisan azonosítania a kötési forrásokat, ha attribútumokat alkalmaz a műveleti paraméterekre. A kötési forrás következtetési szabályai az alábbiak szerint működnek:

  • [FromServices] a DI-tárolóban regisztrált összetett típusú paraméterekre következtet.
  • [FromBody] A rendszer a DI-tárolóban nem regisztrált összetett típusú paraméterekre következtet. A következtetési szabály alól kivételt [FromBody] képez minden összetett, beépített típus, amely speciális jelentéssel rendelkezik, például IFormCollection és CancellationToken. A kötés forráskódja figyelmen kívül hagyja ezeket a speciális típusokat.
  • [FromForm] a függvény a következő típusú IFormFileIFormFileCollectionműveletparaméterekre következtet: Az egyszerű vagy felhasználó által definiált típusok esetében ez nem következik be.
  • [FromRoute] következtetés vonható le bármely műveletparaméter-névre, amely megfelel egy paraméternek az útvonalsablonban. Ha egynél több útvonal megfelel egy műveleti paraméternek, a rendszer minden útvonalértéket figyelembe veszi [FromRoute].
  • [FromQuery] következtetésre jut bármely más műveleti paraméter esetén.

FromBody következtetési megjegyzések

[FromBody] nem kerül kikövetkeztetésre egyszerű típusok esetén, mint például string vagy int. Ezért az [FromBody] attribútumot egyszerű típusokhoz kell használni, ha erre a funkcióra van szükség.

Ha egy művelethez egynél több paraméter van kötve a kérelemtörzsből, kivétel lép fel. Az alábbi műveletmetódus-aláírások például kivételt okoznak:

  • [FromBody] mindkettőre egyel következtetett, mert ezek összetett adattípusok.

    [HttpPost]
    public IActionResult Action1(Product product, Order order)
    
  • [FromBody] attribútum az egyiken, a másik pedig inferált, mert összetett típus.

    [HttpPost]
    public IActionResult Action2(Product product, [FromBody] Order order)
    
  • [FromBody] attribútum mindkét elemen található.

    [HttpPost]
    public IActionResult Action3([FromBody] Product product, [FromBody] Order order)
    

FromServices következtetési megjegyzések

A paraméterkötés függőséginjektáláson keresztül köti meg a paramétereket, ha a típus szolgáltatásként van konfigurálva. Ez azt jelenti, hogy nem szükséges explicit módon alkalmazni az [FromServices] attribútumot egy paraméterre. A következő kódban mindkét művelet az időt adja vissza:

[Route("[controller]")]
[ApiController]
public class MyController : ControllerBase
{
    public ActionResult GetWithAttribute([FromServices] IDateTime dateTime) 
                                                        => Ok(dateTime.Now);

    [Route("noAttribute")]
    public ActionResult Get(IDateTime dateTime) => Ok(dateTime.Now);
}

Ritkán előfordulhat, hogy az automatikus DI megszakítja azokat az alkalmazásokat, amelyek a DI-ben olyan típusúak, amelyeket az API-vezérlő műveleti módszerei is elfogadnak. Nem gyakori, hogy egy típus szerepel a DI-ben, és argumentumként egy API-vezérlő műveletben.

Egy műveletparaméter következtetésének letiltásához alkalmazza a paraméterre a kívánt kötésforrás-attribútumot. Alkalmazza például az [FromBody] attribútumot egy olyan műveleti paraméterre, amelyet a kérelem törzsétől kell kötni.

Ha globálisan szeretné letiltani [FromServices] a következtetést, állítsa a DisableImplicitFromServicesParameters beállítást a következőre true:

using Microsoft.AspNetCore.Mvc;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers();
builder.Services.AddSingleton<IDateTime, SystemDateTime>();

builder.Services.Configure<ApiBehaviorOptions>(options =>
{
    options.DisableImplicitFromServicesParameters = true;
});

var app = builder.Build();

app.MapControllers();

app.Run();

Az alkalmazás indításakor IServiceProviderIsService a rendszer ellenőrzi a típusokat annak megállapításához, hogy egy API-vezérlő művelet argumentuma a DI-ből vagy a többi forrásból származik-e.

Az API Controller műveleti paramétereinek kötési forrásának következtetésére szolgáló mechanizmus a következő szabályokat használja:

Következtetési szabályok letiltása

A kötési forrás következtetésének letiltásához állítsa a SuppressInferBindingSourcesForParameters következőre true:

using Microsoft.AspNetCore.Mvc;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers()
    .ConfigureApiBehaviorOptions(options =>
    {
        options.SuppressConsumesConstraintForFormFileParameters = true;
        options.SuppressInferBindingSourcesForParameters = true;
        options.SuppressModelStateInvalidFilter = true;
        options.SuppressMapClientErrors = true;
        options.ClientErrorMapping[StatusCodes.Status404NotFound].Link =
            "https://httpstatuses.com/404";
        options.DisableImplicitFromServicesParameters = true;
    });

var app = builder.Build();

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run();

Többrészes/űrlapadat-kérelem következtetése

Az [ApiController] attribútum következtetési szabályt alkalmaz az IFormFile és IFormFileCollection típusú akcióparaméterekre. A multipart/form-data kérelem tartalomtípusa ezekre a típusokra következtet.

Az alapértelmezett viselkedés letiltásához állítsa a SuppressConsumesConstraintForFormFileParameters tulajdonságot a(z) true értékre:

using Microsoft.AspNetCore.Mvc;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers()
    .ConfigureApiBehaviorOptions(options =>
    {
        options.SuppressConsumesConstraintForFormFileParameters = true;
        options.SuppressInferBindingSourcesForParameters = true;
        options.SuppressModelStateInvalidFilter = true;
        options.SuppressMapClientErrors = true;
        options.ClientErrorMapping[StatusCodes.Status404NotFound].Link =
            "https://httpstatuses.com/404";
    });

var app = builder.Build();

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run();

Hibaállapot-kódokkal kapcsolatos probléma részletei

Az MVC egy hibaeredményt (a 400-os vagy újabb állapotkódú eredményt) a következő ProblemDetailseredményre alakítja át: . A ProblemDetails típus az RFC 7807 specifikáción alapul, amely géppel olvasható hibaadatokat biztosít egy HTTP-válaszban.

Vegye figyelembe a következő kódot egy vezérlőműveletben:

if (pet == null)
{
    return NotFound();
}

A NotFound metódus egy HTTP 404-állapotkódot hoz létre egy ProblemDetails törzstel. Például:

{
  type: "https://tools.ietf.org/html/rfc7231#section-6.5.4",
  title: "Not Found",
  status: 404,
  traceId: "0HLHLV31KRN83:00000001"
}

ProblemDetails-válasz letiltása

A ProblemDetails hibaállapot-kódok automatikus létrehozása le van tiltva, ha a SuppressMapClientErrors tulajdonság true értékre van állítva. Adja hozzá a következő kódot:

using Microsoft.AspNetCore.Mvc;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers()
    .ConfigureApiBehaviorOptions(options =>
    {
        options.SuppressConsumesConstraintForFormFileParameters = true;
        options.SuppressInferBindingSourcesForParameters = true;
        options.SuppressModelStateInvalidFilter = true;
        options.SuppressMapClientErrors = true;
        options.ClientErrorMapping[StatusCodes.Status404NotFound].Link =
            "https://httpstatuses.com/404";
    });

var app = builder.Build();

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run();

Támogatott kérés tartalomtípusainak definiálása a [Felhasználások] attribútummal

Alapértelmezés szerint egy művelet támogatja az összes elérhető kérelemtartalomtípust. Ha például egy alkalmazás úgy van konfigurálva, hogy támogatja a JSON- és XML-bemeneti formátumkészítőket is, egy művelet több tartalomtípust is támogat, köztük application/json és application/xml.

A [Felhasználás] attribútum lehetővé teszi, hogy egy művelet korlátozza a támogatott kérelem tartalomtípusait. Alkalmazza az [Consumes] attribútumot egy műveletre vagy vezérlőre egy vagy több tartalomtípus megadásával:

[HttpPost]
[Consumes("application/xml")]
public IActionResult CreateProduct(Product product)

Az előző kódban a CreateProduct művelet megadja a tartalom típusát application/xml. Az ehhez a művelethez irányított kérelmeknek meg kell adniuk a Content-Type fejlécet.application/xml Azok a kérések, amelyek nem adnak meg Content-Typeapplication/xml fejlécet, 415 Nem támogatott médiatípus válasz eredményeznek.

Az [Consumes] attribútum azt is lehetővé teszi, hogy egy művelet egy típuskényszer alkalmazásával egy bejövő kérelem tartalomtípusa alapján befolyásolja a kijelölést. Vegye figyelembe a következő példát:

[ApiController]
[Route("api/[controller]")]
public class ConsumesController : ControllerBase
{
    [HttpPost]
    [Consumes("application/json")]
    public IActionResult PostJson(IEnumerable<int> values) =>
        Ok(new { Consumes = "application/json", Values = values });

    [HttpPost]
    [Consumes("application/x-www-form-urlencoded")]
    public IActionResult PostForm([FromForm] IEnumerable<int> values) =>
        Ok(new { Consumes = "application/x-www-form-urlencoded", Values = values });
}

Az előző kódban ConsumesController az URL-címre küldött https://localhost:5001/api/Consumes kérelmek kezelésére van konfigurálva. A vezérlő mindkét művelete, PostJson és PostForm, ugyanazzal az URL-címmel POST kéréseket kezel. [Consumes] A típuskorlátozást alkalmazó attribútum nélkül a rendszer nem egyértelmű egyezés-kivételt vet ki.

Az [Consumes] attribútum mindkét műveletre érvényes. A PostJson művelet a következő fejléccel Content-Typeapplication/jsonküldött kéréseket kezeli: . A PostForm művelet a következő fejléccel Content-Typeapplication/x-www-form-urlencodedküldött kéréseket kezeli: .

További erőforrások

ASP.NET Core támogatja a webes API-k vezérlőkkel vagy minimális API-k használatával történő létrehozását. A webes API-k vezérlői olyan osztályok, amelyek a következőből ControllerBaseszármaznak: . Ez a cikk bemutatja, hogyan használhat vezérlőket a webes API-kérések kezeléséhez. A webes API-k vezérlők nélküli létrehozásáról a következő oktatóanyagban olvashat: Minimális API létrehozása ASP.NET Core használatával.

ControllerBase-osztály

A vezérlőalapú webes API egy vagy több vezérlőosztályból áll, amelyek ControllerBaseszármaznak. A webes API-projektsablon egy kezdővezérlőt biztosít:

[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase

A webes API-vezérlőknek általában a ControllerBase-ból kell származniuk, nem pedig a Controller-ből. Controller ControllerBase származik, és támogatja a nézeteket, így a weblapok kezelésére szolgál, nem a webes API-kérelmekre. Ha ugyanannak a vezérlőnek támogatnia kell a nézeteket és a webes API-kat, akkor a következőből Controllerszármazik: .

A ControllerBase osztály számos olyan tulajdonságot és metódust biztosít, amelyek hasznosak a HTTP-kérések kezeléséhez. Például a CreatedAtAction egy 201-es állapotkódot ad vissza.

[HttpPost]
[ProducesResponseType(StatusCodes.Status201Created)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
public ActionResult<Pet> Create(Pet pet)
{
    pet.Id = _petsInMemoryStore.Any() ? 
             _petsInMemoryStore.Max(p => p.Id) + 1 : 1;
    _petsInMemoryStore.Add(pet);

    return CreatedAtAction(nameof(GetById), new { id = pet.Id }, pet);
}

Az alábbi táblázat példákat tartalmaz a metódusokra a következőben ControllerBase: .

Method Notes
BadRequest 400 állapotkódot ad vissza.
NotFound 404-es állapotkódot ad vissza.
PhysicalFile Egy fájlt ad vissza.
TryUpdateModelAsync Modellkötés meghívása.
TryValidateModel Modellérvényesítést hív meg.

Az összes elérhető metódus és tulajdonság listáját lásd ControllerBase: .

Attributes

A Microsoft.AspNetCore.Mvc névtér olyan attribútumokat biztosít, amelyek a webes API-vezérlők és műveleti módszerek viselkedésének konfigurálására használhatók. Az alábbi példa attribútumokkal adja meg a támogatott HTTP-műveleti parancsot és az esetlegesen visszaadható ismert HTTP-állapotkódokat:

[HttpPost]
[ProducesResponseType(StatusCodes.Status201Created)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
public ActionResult<Pet> Create(Pet pet)
{
    pet.Id = _petsInMemoryStore.Any() ? 
             _petsInMemoryStore.Max(p => p.Id) + 1 : 1;
    _petsInMemoryStore.Add(pet);

    return CreatedAtAction(nameof(GetById), new { id = pet.Id }, pet);
}

Íme néhány további példa az elérhető attribútumokra.

Attribute Notes
[Route] Egy vezérlő vagy művelet URL-mintázatát adja meg.
[Bind] Megadja a modellkötéshez felvenni kívánt előtagot és tulajdonságokat.
[HttpGet] A HTTP GET művelet igét támogató műveletet azonosít.
[Consumes] Megadja azokat az adattípusokat, amelyeket egy művelet elfogad.
[Produces] Megadja a művelet által visszaadott adattípusokat.

Az elérhető attribútumokat tartalmazó listákért tekintse meg a Microsoft.AspNetCore.Mvc névteret.

ApiController attribútum

Az [ApiController] attribútum egy vezérlőosztályra alkalmazható a következő véleményezett, API-specifikus viselkedések engedélyezéséhez:

Adott vezérlők attribútuma

Az [ApiController] attribútum adott vezérlőkre alkalmazható, ahogyan a projektsablon alábbi példájában is látható:

[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase

Attribútum több vezérlőn

Az attribútumot egynél több vezérlőn is használhatja, ha létrehoz egy egyéni alapvezérlőosztályt, amely az [ApiController] attribútummal van eljegyzve. Az alábbi példa egy egyéni alaposztályt és egy belőle származó vezérlőt mutat be:

[ApiController]
public class MyControllerBase : ControllerBase
{
}
[Produces(MediaTypeNames.Application.Json)]
[Route("[controller]")]
public class PetsController : MyControllerBase

Attribútum egy összeállításban

Az [ApiController] attribútum alkalmazható egy szerelvényre. Amikor az [ApiController] attribútumot egy szerelvényre alkalmazza, a szerelvény összes vezérlője alkalmazza az [ApiController] attribútumot. Az egyes vezérlők nem választhatók ki. Alkalmazza a szerelvényszintű attribútumot a Program.cs fájlra:

using Microsoft.AspNetCore.Mvc;
[assembly: ApiController]

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers();

var app = builder.Build();

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run();

Attribútum alapú útválasztás követelmény

Az [ApiController] attribútum követelménysé teszi az attribútum-útválasztást. Például:

[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase

A műveletek nem érhetők el a , UseEndpoints és UseMvc által meghatározott hagyományos útvonalakon keresztül.

Automatikus HTTP 400-válaszok

Az [ApiController] attribútum automatikusan elindít egy HTTP 400-választ a modellérvényesítési hibák miatt. Ezért a következő kód szükségtelen egy műveletmetódusban:

if (!ModelState.IsValid)
{
    return BadRequest(ModelState);
}

ASP.NET Core MVC a ModelStateInvalidFilter műveletszűrővel hajtja végre az előző ellenőrzést.

Alapértelmezett BadRequest-válasz

A szerializált típusra az alábbi választörzs mutat példát:

{
  "": [
    "A non-empty request body is required."
  ]
}

A HTTP 400-válaszok alapértelmezett választípusa a következő ValidationProblemDetails. A szerializált típusra az alábbi választörzs mutat példát:

{
  "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
  "title": "One or more validation errors occurred.",
  "status": 400,
  "traceId": "|7fb5e16a-4c8f23bbfc974667.",
  "errors": {
    "": [
      "A non-empty request body is required."
    ]
  }
}

A ValidationProblemDetails típus:

Az automatikus és egyéni válaszok konzisztenssé tétele érdekében a ValidationProblem metódust hívja meg ahelyett, hogy BadRequest. ValidationProblem objektumot ad vissza ValidationProblemDetails -ként, valamint az automatikus választ is.

Automatikus 400 válasz naplózása

Az automatikus 400 válasz naplózásához állítsa be a InvalidModelStateResponseFactory delegált tulajdonságot egyéni feldolgozásra. Alapértelmezés szerint InvalidModelStateResponseFactory a ProblemDetailsFactory létrehozásához a ValidationProblemDetails használja.

Az alábbi példa bemutatja, hogyan kérhető le egy ILogger<TCategoryName> példány, hogy naplózza egy automatikus 400-válasz adatait.

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers()
    .ConfigureApiBehaviorOptions(options =>
    {
      // To preserve the default behavior, capture the original delegate to call later.
        var builtInFactory = options.InvalidModelStateResponseFactory;

        options.InvalidModelStateResponseFactory = context =>
        {
            var logger = context.HttpContext.RequestServices
                                .GetRequiredService<ILogger<Program>>();

            // Perform logging here.
            // ...

            // Invoke the default behavior, which produces a ValidationProblemDetails
            // response.
            // To produce a custom response, return a different implementation of 
            // IActionResult instead.
            return builtInFactory(context);
        };
    });

var app = builder.Build();

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run();

Automatikus 400-válasz letiltása

Az automatikus 400 viselkedés letiltásához állítsa a SuppressModelStateInvalidFilter tulajdonságot a következőre: true. Adja hozzá a következő kiemelt kódot:

using Microsoft.AspNetCore.Mvc;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers()
    .ConfigureApiBehaviorOptions(options =>
    {
        options.SuppressConsumesConstraintForFormFileParameters = true;
        options.SuppressInferBindingSourcesForParameters = true;
        options.SuppressModelStateInvalidFilter = true;
        options.SuppressMapClientErrors = true;
        options.ClientErrorMapping[StatusCodes.Status404NotFound].Link =
            "https://httpstatuses.com/404";
    });

var app = builder.Build();

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run();

Kötés forrásparaméterének következtetése

A kötési forrásattribútum határozza meg azt a helyet, ahol egy műveleti paraméter értéke található. A következő kötési forrásattribútumok léteznek:

Attribute Kötés forrása
[FromBody] A kérés tartalma
[FromForm] Űrlap adat a kérelem törzsében
[FromHeader] Kérelem fejléce
[FromQuery] Lekérdezési sztring paraméter kérése
[FromRoute] Adatok átirányítása az aktuális kérelemből
[FromServices] A kérelemszolgáltatás műveletparaméterként injektálva

Warning

Ne használja [FromRoute] , ha az értékek tartalmazhatnak %2f (azaz /). %2f nem lesz feloldva / formátumra. Akkor használja [FromQuery] , ha az érték tartalmazhat %2f.

Az ASP.NET Core futtatókörnyezet az [ApiController] vagy a kötési forrásattribútumok, mint [FromQuery], hiányában próbálja meg az összetett objektummodell-kötőt használni. Az összetett objektummodell-iratgyűjtő meghatározott sorrendben kér le adatokat az értékszolgáltatóktól.

Az alábbi példában az [FromQuery] attribútum azt jelzi, hogy a discontinuedOnly paraméter értéke a kérelem URL-címének lekérdezési sztringjében van megadva:

[HttpGet]
public ActionResult<List<Product>> Get(
    [FromQuery] bool discontinuedOnly = false)
{
    List<Product> products = null;

    if (discontinuedOnly)
    {
        products = _productsInMemoryStore.Where(p => p.IsDiscontinued).ToList();
    }
    else
    {
        products = _productsInMemoryStore;
    }

    return products;
}

Az [ApiController] attribútum következtetési szabályokat alkalmaz a műveleti paraméterek alapértelmezett adatforrásaira. Ezekkel a szabályokkal nem kell manuálisan azonosítania a kötési forrásokat, ha attribútumokat alkalmaz a műveleti paraméterekre. A kötési forrás következtetési szabályai az alábbiak szerint működnek:

  • [FromBody] A rendszer a DI-tárolóban nem regisztrált összetett típusú paraméterekre következtet. A következtetési szabály alól kivételt [FromBody] képez minden összetett, beépített típus, amely speciális jelentéssel rendelkezik, például IFormCollection és CancellationToken. A kötés forráskódja figyelmen kívül hagyja ezeket a speciális típusokat.
  • [FromForm] a függvény a következő típusú IFormFileIFormFileCollectionműveletparaméterekre következtet: Az egyszerű vagy felhasználó által definiált típusok esetében ez nem következik be.
  • [FromRoute] következtetés vonható le bármely műveletparaméter-névre, amely megfelel egy paraméternek az útvonalsablonban. Ha egynél több útvonal megfelel egy műveleti paraméternek, a rendszer minden útvonalértéket figyelembe veszi [FromRoute].
  • [FromQuery] következtetésre jut bármely más műveleti paraméter esetén.

FromBody következtetési megjegyzések

[FromBody] nem kerül kikövetkeztetésre egyszerű típusok esetén, mint például string vagy int. Ezért az [FromBody] attribútumot egyszerű típusokhoz kell használni, ha erre a funkcióra van szükség.

Ha egy művelethez egynél több paraméter van kötve a kérelemtörzsből, kivétel lép fel. Az alábbi műveletmetódus-aláírások például kivételt okoznak:

  • [FromBody] mindkettőre egyel következtetett, mert ezek összetett adattípusok.

    [HttpPost]
    public IActionResult Action1(Product product, Order order)
    
  • [FromBody] attribútum az egyiken, a másik pedig inferált, mert összetett típus.

    [HttpPost]
    public IActionResult Action2(Product product, [FromBody] Order order)
    
  • [FromBody] attribútum mindkét elemen található.

    [HttpPost]
    public IActionResult Action3([FromBody] Product product, [FromBody] Order order)
    

Következtetési szabályok letiltása

A kötési forrás következtetésének letiltásához állítsa a SuppressInferBindingSourcesForParameters következőre true:

using Microsoft.AspNetCore.Mvc;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers()
    .ConfigureApiBehaviorOptions(options =>
    {
        options.SuppressConsumesConstraintForFormFileParameters = true;
        options.SuppressInferBindingSourcesForParameters = true;
        options.SuppressModelStateInvalidFilter = true;
        options.SuppressMapClientErrors = true;
        options.ClientErrorMapping[StatusCodes.Status404NotFound].Link =
            "https://httpstatuses.com/404";
    });

var app = builder.Build();

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run();

Többrészes/űrlapadat-kérelem következtetése

Az [ApiController] attribútum következtetési szabályt alkalmaz az IFormFile és IFormFileCollection típusú akcióparaméterekre. A multipart/form-data kérelem tartalomtípusa ezekre a típusokra következtet.

Az alapértelmezett viselkedés letiltásához állítsa a SuppressConsumesConstraintForFormFileParameters tulajdonságot a(z) true értékre:

using Microsoft.AspNetCore.Mvc;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers()
    .ConfigureApiBehaviorOptions(options =>
    {
        options.SuppressConsumesConstraintForFormFileParameters = true;
        options.SuppressInferBindingSourcesForParameters = true;
        options.SuppressModelStateInvalidFilter = true;
        options.SuppressMapClientErrors = true;
        options.ClientErrorMapping[StatusCodes.Status404NotFound].Link =
            "https://httpstatuses.com/404";
    });

var app = builder.Build();

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run();

Hibaállapot-kódokkal kapcsolatos probléma részletei

Az MVC egy hibaeredményt (a 400-os vagy újabb állapotkódú eredményt) a következő ProblemDetailseredményre alakítja át: . A ProblemDetails típus az RFC 7807 specifikáción alapul, amely géppel olvasható hibaadatokat biztosít egy HTTP-válaszban.

Vegye figyelembe a következő kódot egy vezérlőműveletben:

if (pet == null)
{
    return NotFound();
}

A NotFound metódus egy HTTP 404-állapotkódot hoz létre egy ProblemDetails törzstel. Például:

{
  type: "https://tools.ietf.org/html/rfc7231#section-6.5.4",
  title: "Not Found",
  status: 404,
  traceId: "0HLHLV31KRN83:00000001"
}

ProblemDetails-válasz letiltása

A ProblemDetails hibaállapot-kódok automatikus létrehozása le van tiltva, ha a SuppressMapClientErrors tulajdonság értéke true.

using Microsoft.AspNetCore.Mvc;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers()
    .ConfigureApiBehaviorOptions(options =>
    {
        options.SuppressConsumesConstraintForFormFileParameters = true;
        options.SuppressInferBindingSourcesForParameters = true;
        options.SuppressModelStateInvalidFilter = true;
        options.SuppressMapClientErrors = true;
        options.ClientErrorMapping[StatusCodes.Status404NotFound].Link =
            "https://httpstatuses.com/404";
    });

var app = builder.Build();

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run();

Támogatott kérés tartalomtípusainak definiálása a [Felhasználások] attribútummal

Alapértelmezés szerint egy művelet támogatja az összes elérhető kérelemtartalomtípust. Ha például egy alkalmazás úgy van konfigurálva, hogy támogatja a JSON- és XML-bemeneti formátumkészítőket is, egy művelet több tartalomtípust is támogat, köztük application/json és application/xml.

A [Felhasználás] attribútum lehetővé teszi, hogy egy művelet korlátozza a támogatott kérelem tartalomtípusait. Alkalmazza az [Consumes] attribútumot egy műveletre vagy vezérlőre egy vagy több tartalomtípus megadásával:

[HttpPost]
[Consumes("application/xml")]
public IActionResult CreateProduct(Product product)

Az előző kódban a CreateProduct művelet megadja a tartalom típusát application/xml. Az ehhez a művelethez irányított kérelmeknek meg kell adniuk a Content-Type fejlécet.application/xml Azok a kérések, amelyek nem adnak meg Content-Typeapplication/xml fejlécet, 415 Nem támogatott médiatípus válasz eredményeznek.

Az [Consumes] attribútum azt is lehetővé teszi, hogy egy művelet egy típuskényszer alkalmazásával egy bejövő kérelem tartalomtípusa alapján befolyásolja a kijelölést. Vegye figyelembe a következő példát:

[ApiController]
[Route("api/[controller]")]
public class ConsumesController : ControllerBase
{
    [HttpPost]
    [Consumes("application/json")]
    public IActionResult PostJson(IEnumerable<int> values) =>
        Ok(new { Consumes = "application/json", Values = values });

    [HttpPost]
    [Consumes("application/x-www-form-urlencoded")]
    public IActionResult PostForm([FromForm] IEnumerable<int> values) =>
        Ok(new { Consumes = "application/x-www-form-urlencoded", Values = values });
}

Az előző kódban ConsumesController az URL-címre küldött https://localhost:5001/api/Consumes kérelmek kezelésére van konfigurálva. A vezérlő mindkét művelete, PostJson és PostForm, ugyanazzal az URL-címmel POST kéréseket kezel. [Consumes] A típuskorlátozást alkalmazó attribútum nélkül a rendszer nem egyértelmű egyezés-kivételt vet ki.

Az [Consumes] attribútum mindkét műveletre érvényes. A PostJson művelet a következő fejléccel Content-Typeapplication/jsonküldött kéréseket kezeli: . A PostForm művelet a következő fejléccel Content-Typeapplication/x-www-form-urlencodedküldött kéréseket kezeli: .

További erőforrások

ASP.NET Core támogatja a RESTful-szolgáltatások, más néven webes API-k létrehozását a C# használatával. A kérések kezeléséhez a webes API vezérlőket használ. A webes API-k vezérlői olyan osztályok, amelyek a következőből ControllerBaseszármaznak: . Ez a cikk bemutatja, hogyan használhat vezérlőket a webes API-kérések kezeléséhez.

Mintakód megtekintése vagy letöltése. (A letöltés módja).

ControllerBase-osztály

A webes API egy vagy több vezérlőosztályból áll, amelyek a következőkből ControllerBaseszármaznak: . A webes API-projektsablon egy kezdővezérlőt biztosít:

[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase

Ne hozzon létre webes API-vezérlőt az Controller osztályból való származtatással. Controller ControllerBase származik, és támogatja a nézeteket, így a weblapok kezelésére szolgál, nem a webes API-kérelmekre. Kivételt képez ez a szabály: ha ugyanazt a vezérlőt szeretné használni a nézetekhez és a webes API-khoz is, származtathatja a következőből Controller: .

A ControllerBase osztály számos olyan tulajdonságot és metódust biztosít, amelyek hasznosak a HTTP-kérések kezeléséhez. Például a ControllerBase.CreatedAtAction egy 201-es állapotkódot ad vissza.

[HttpPost]
[ProducesResponseType(StatusCodes.Status201Created)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
public ActionResult<Pet> Create(Pet pet)
{
    pet.Id = _petsInMemoryStore.Any() ? 
             _petsInMemoryStore.Max(p => p.Id) + 1 : 1;
    _petsInMemoryStore.Add(pet);

    return CreatedAtAction(nameof(GetById), new { id = pet.Id }, pet);
}

Íme néhány további példa a metódusokra.ControllerBase

Method Notes
BadRequest 400 állapotkódot ad vissza.
NotFound 404-es állapotkódot ad vissza.
PhysicalFile Egy fájlt ad vissza.
TryUpdateModelAsync Modellkötés meghívása.
TryValidateModel Modellérvényesítést hív meg.

Az összes elérhető metódus és tulajdonság listáját lásd ControllerBase: .

Attributes

A Microsoft.AspNetCore.Mvc névtér olyan attribútumokat biztosít, amelyek a webes API-vezérlők és műveleti módszerek viselkedésének konfigurálására használhatók. Az alábbi példa attribútumokkal adja meg a támogatott HTTP-műveleti parancsot és az esetlegesen visszaadható ismert HTTP-állapotkódokat:

[HttpPost]
[ProducesResponseType(StatusCodes.Status201Created)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
public ActionResult<Pet> Create(Pet pet)
{
    pet.Id = _petsInMemoryStore.Any() ? 
             _petsInMemoryStore.Max(p => p.Id) + 1 : 1;
    _petsInMemoryStore.Add(pet);

    return CreatedAtAction(nameof(GetById), new { id = pet.Id }, pet);
}

Íme néhány további példa az elérhető attribútumokra.

Attribute Notes
[Route] Egy vezérlő vagy művelet URL-mintázatát adja meg.
[Bind] Megadja a modellkötéshez felvenni kívánt előtagot és tulajdonságokat.
[HttpGet] A HTTP GET művelet igét támogató műveletet azonosít.
[Consumes] Megadja azokat az adattípusokat, amelyeket egy művelet elfogad.
[Produces] Megadja a művelet által visszaadott adattípusokat.

Az elérhető attribútumokat tartalmazó listákért tekintse meg a Microsoft.AspNetCore.Mvc névteret.

ApiController attribútum

Az [ApiController] attribútum egy vezérlőosztályra alkalmazható a következő véleményezett, API-specifikus viselkedések engedélyezéséhez:

Adott vezérlők attribútuma

Az [ApiController] attribútum adott vezérlőkre alkalmazható, ahogyan a projektsablon alábbi példájában is látható:

[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase

Attribútum több vezérlőn

Az attribútumot egynél több vezérlőn is használhatja, ha létrehoz egy egyéni alapvezérlőosztályt, amely az [ApiController] attribútummal van eljegyzve. Az alábbi példa egy egyéni alaposztályt és egy belőle származó vezérlőt mutat be:

[ApiController]
public class MyControllerBase : ControllerBase
{
}
[Produces(MediaTypeNames.Application.Json)]
[Route("[controller]")]
public class PetsController : MyControllerBase

Attribútum egy összeállításban

Az [ApiController] attribútum alkalmazható egy szerelvényre. Az ilyen megjegyzések webes API-viselkedést alkalmaznak a szerelvény összes vezérlőjében. Az egyes vezérlők nem választhatók ki. Alkalmazza a szerelvényszintű attribútumot az osztályt körülvevő névtér-deklarációra Startup :

[assembly: ApiController]
namespace WebApiSample
{
    public class Startup
    {
        ...
    }
}

Attribútum alapú útválasztás követelmény

Az [ApiController] attribútum követelménysé teszi az attribútum-útválasztást. Például:

[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase

** A műveletek a hagyományos útvonalakon keresztül, amelyeket a UseEndpoints, UseMvc, vagy UseMvcWithDefaultRoute-ban/-ben meghatároztak a Startup.Configure-ban/-ben, nem érhetők el.

Automatikus HTTP 400-válaszok

Az [ApiController] attribútum automatikusan elindít egy HTTP 400-választ a modellérvényesítési hibák miatt. Ezért a következő kód szükségtelen egy műveletmetódusban:

if (!ModelState.IsValid)
{
    return BadRequest(ModelState);
}

ASP.NET Core MVC a ModelStateInvalidFilter műveletszűrővel hajtja végre az előző ellenőrzést.

Alapértelmezett BadRequest-válasz

A szerializált típusra az alábbi kérelemtörzs mutat példát:

{
  "": [
    "A non-empty request body is required."
  ]
}

A HTTP 400-válaszok alapértelmezett választípusa a következő ValidationProblemDetails. A szerializált típusra az alábbi kérelemtörzs mutat példát:

{
  "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
  "title": "One or more validation errors occurred.",
  "status": 400,
  "traceId": "|7fb5e16a-4c8f23bbfc974667.",
  "errors": {
    "": [
      "A non-empty request body is required."
    ]
  }
}

A ValidationProblemDetails típus:

Az automatikus és egyéni válaszok konzisztenssé tétele érdekében a ValidationProblem metódust hívja meg ahelyett, hogy BadRequest. ValidationProblem objektumot ad vissza ValidationProblemDetails -ként, valamint az automatikus választ is.

Automatikus 400 válasz naplózása

Az automatikus 400 válaszok naplózásához állítsa be a InvalidModelStateResponseFactory delegált tulajdonságot úgy, hogy egyéni feldolgozást végezzen a Startup.ConfigureServices osztályon belül. Alapértelmezés szerint InvalidModelStateResponseFactory a ProblemDetailsFactory létrehozásához a ValidationProblemDetails használja.

Az alábbi példa bemutatja, hogyan kérhető le egy ILogger<TCategoryName> példány, hogy naplózza egy automatikus 400-válasz adatait.

services.AddControllers()
    .ConfigureApiBehaviorOptions(options =>
    {
        // To preserve the default behavior, capture the original delegate to call later.
        var builtInFactory = options.InvalidModelStateResponseFactory;

        options.InvalidModelStateResponseFactory = context =>
        {
            var logger = context.HttpContext.RequestServices.GetRequiredService<ILogger<Startup>>();

            // Perform logging here.
            // ...

            // Invoke the default behavior, which produces a ValidationProblemDetails response.
            // To produce a custom response, return a different implementation of IActionResult instead.
            return builtInFactory(context);
        };
    });

Automatikus 400-válasz letiltása

Az automatikus 400 viselkedés letiltásához állítsa a SuppressModelStateInvalidFilter tulajdonságot a következőre: true. Adja hozzá a következő kiemelt kódot a következőben Startup.ConfigureServices:

services.AddControllers()
    .ConfigureApiBehaviorOptions(options =>
    {
        options.SuppressConsumesConstraintForFormFileParameters = true;
        options.SuppressInferBindingSourcesForParameters = true;
        options.SuppressModelStateInvalidFilter = true;
        options.SuppressMapClientErrors = true;
        options.ClientErrorMapping[StatusCodes.Status404NotFound].Link =
            "https://httpstatuses.com/404";
        options.DisableImplicitFromServicesParameters = true;
    });

Kötés forrásparaméterének következtetése

A kötési forrásattribútum határozza meg azt a helyet, ahol egy műveleti paraméter értéke található. A következő kötési forrásattribútumok léteznek:

Attribute Kötés forrása
[FromBody] A kérés tartalma
[FromForm] Űrlap adat a kérelem törzsében
[FromHeader] Kérelem fejléce
[FromQuery] Lekérdezési sztring paraméter kérése
[FromRoute] Adatok átirányítása az aktuális kérelemből
[FromServices] A kérelemszolgáltatás műveletparaméterként injektálva

Warning

Ne használja [FromRoute] , ha az értékek tartalmazhatnak %2f (azaz /). %2f nem lesz feloldva / formátumra. Akkor használja [FromQuery] , ha az érték tartalmazhat %2f.

Az ASP.NET Core futtatókörnyezet az [ApiController] vagy a kötési forrásattribútumok, mint [FromQuery], hiányában próbálja meg az összetett objektummodell-kötőt használni. Az összetett objektummodell-iratgyűjtő meghatározott sorrendben kér le adatokat az értékszolgáltatóktól.

Az alábbi példában az [FromQuery] attribútum azt jelzi, hogy a discontinuedOnly paraméter értéke a kérelem URL-címének lekérdezési sztringjében van megadva:

[HttpGet]
public ActionResult<List<Product>> Get(
    [FromQuery] bool discontinuedOnly = false)
{
    List<Product> products = null;

    if (discontinuedOnly)
    {
        products = _productsInMemoryStore.Where(p => p.IsDiscontinued).ToList();
    }
    else
    {
        products = _productsInMemoryStore;
    }

    return products;
}

Az [ApiController] attribútum következtetési szabályokat alkalmaz a műveleti paraméterek alapértelmezett adatforrásaira. Ezekkel a szabályokkal nem kell manuálisan azonosítania a kötési forrásokat, ha attribútumokat alkalmaz a műveleti paraméterekre. A kötési forrás következtetési szabályai az alábbiak szerint működnek:

  • [FromBody] összetett típusparaméterekre következtet. A következtetési szabály alól kivételt [FromBody] képez minden összetett, beépített típus, amely speciális jelentéssel rendelkezik, például IFormCollection és CancellationToken. A kötés forráskódja figyelmen kívül hagyja ezeket a speciális típusokat.
  • [FromForm] a függvény a következő típusú IFormFileIFormFileCollectionműveletparaméterekre következtet: Az egyszerű vagy felhasználó által definiált típusok esetében ez nem következik be.
  • [FromRoute] következtetés vonható le bármely műveletparaméter-névre, amely megfelel egy paraméternek az útvonalsablonban. Ha egynél több útvonal megfelel egy műveleti paraméternek, a rendszer minden útvonalértéket figyelembe veszi [FromRoute].
  • [FromQuery] következtetésre jut bármely más műveleti paraméter esetén.

FromBody következtetési megjegyzések

[FromBody] nem kerül kikövetkeztetésre egyszerű típusok esetén, mint például string vagy int. Ezért az [FromBody] attribútumot egyszerű típusokhoz kell használni, ha erre a funkcióra van szükség.

Ha egy művelethez egynél több paraméter van kötve a kérelemtörzsből, kivétel lép fel. Az alábbi műveletmetódus-aláírások például kivételt okoznak:

  • [FromBody] mindkettőre egyel következtetett, mert ezek összetett adattípusok.

    [HttpPost]
    public IActionResult Action1(Product product, Order order)
    
  • [FromBody] attribútum az egyiken, a másik pedig inferált, mert összetett típus.

    [HttpPost]
    public IActionResult Action2(Product product, [FromBody] Order order)
    
  • [FromBody] attribútum mindkét elemen található.

    [HttpPost]
    public IActionResult Action3([FromBody] Product product, [FromBody] Order order)
    

Következtetési szabályok letiltása

A forráskötés következtetésének letiltásához állítsa be a SuppressInferBindingSourcesForParameters értéket true. Adja hozzá a következő kódot a Startup.ConfigureServices:

services.AddControllers()
    .ConfigureApiBehaviorOptions(options =>
    {
        options.SuppressConsumesConstraintForFormFileParameters = true;
        options.SuppressInferBindingSourcesForParameters = true;
        options.SuppressModelStateInvalidFilter = true;
        options.SuppressMapClientErrors = true;
        options.ClientErrorMapping[StatusCodes.Status404NotFound].Link =
            "https://httpstatuses.com/404";
        options.DisableImplicitFromServicesParameters = true;
    });

Többrészes/űrlapadat-kérelem következtetése

Az [ApiController] attribútum következtetési szabályt alkalmaz az IFormFile és IFormFileCollection típusú akcióparaméterekre. A multipart/form-data kérelem tartalomtípusa ezekre a típusokra következtet.

Az alapértelmezett viselkedés letiltásához állítsa be a SuppressConsumesConstraintForFormFileParameters tulajdonságot a true értékre a(z) Startup.ConfigureServices alkalmazásában.

services.AddControllers()
    .ConfigureApiBehaviorOptions(options =>
    {
        options.SuppressConsumesConstraintForFormFileParameters = true;
        options.SuppressInferBindingSourcesForParameters = true;
        options.SuppressModelStateInvalidFilter = true;
        options.SuppressMapClientErrors = true;
        options.ClientErrorMapping[StatusCodes.Status404NotFound].Link =
            "https://httpstatuses.com/404";
        options.DisableImplicitFromServicesParameters = true;
    });

Hibaállapot-kódokkal kapcsolatos probléma részletei

Az MVC egy hibaeredményt (a 400-os vagy újabb állapotkódú eredményt) a következő ProblemDetailseredményre alakítja át: . A ProblemDetails típus az RFC 7807 specifikáción alapul, amely géppel olvasható hibaadatokat biztosít egy HTTP-válaszban.

Vegye figyelembe a következő kódot egy vezérlőműveletben:

if (pet == null)
{
    return NotFound();
}

A NotFound metódus egy HTTP 404-állapotkódot hoz létre egy ProblemDetails törzstel. Például:

{
  type: "https://tools.ietf.org/html/rfc7231#section-6.5.4",
  title: "Not Found",
  status: 404,
  traceId: "0HLHLV31KRN83:00000001"
}

ProblemDetails-válasz letiltása

A ProblemDetails hibaállapot-kódok automatikus létrehozása le van tiltva, ha a SuppressMapClientErrors tulajdonság true értékre van állítva. Adja hozzá a következő kódot a Startup.ConfigureServices:

services.AddControllers()
    .ConfigureApiBehaviorOptions(options =>
    {
        options.SuppressConsumesConstraintForFormFileParameters = true;
        options.SuppressInferBindingSourcesForParameters = true;
        options.SuppressModelStateInvalidFilter = true;
        options.SuppressMapClientErrors = true;
        options.ClientErrorMapping[StatusCodes.Status404NotFound].Link =
            "https://httpstatuses.com/404";
        options.DisableImplicitFromServicesParameters = true;
    });

Támogatott kérés tartalomtípusainak definiálása a [Felhasználások] attribútummal

Alapértelmezés szerint egy művelet támogatja az összes elérhető kérelemtartalomtípust. Ha például egy alkalmazás úgy van konfigurálva, hogy támogatja a JSON- és XML-bemeneti formátumkészítőket is, egy művelet több tartalomtípust is támogat, köztük application/json és application/xml.

A [Felhasználás] attribútum lehetővé teszi, hogy egy művelet korlátozza a támogatott kérelem tartalomtípusait. Alkalmazza az [Consumes] attribútumot egy műveletre vagy vezérlőre egy vagy több tartalomtípus megadásával:

[HttpPost]
[Consumes("application/xml")]
public IActionResult CreateProduct(Product product)

Az előző kódban a CreateProduct művelet megadja a tartalom típusát application/xml. Az ehhez a művelethez irányított kérelmeknek meg kell adniuk a Content-Type fejlécet.application/xml Azok a kérések, amelyek nem adnak meg Content-Typeapplication/xml fejlécet, 415 Nem támogatott médiatípus válasz eredményeznek.

Az [Consumes] attribútum azt is lehetővé teszi, hogy egy művelet egy típuskényszer alkalmazásával egy bejövő kérelem tartalomtípusa alapján befolyásolja a kijelölést. Vegye figyelembe a következő példát:

[ApiController]
[Route("api/[controller]")]
public class ConsumesController : ControllerBase
{
    [HttpPost]
    [Consumes("application/json")]
    public IActionResult PostJson(IEnumerable<int> values) =>
        Ok(new { Consumes = "application/json", Values = values });

    [HttpPost]
    [Consumes("application/x-www-form-urlencoded")]
    public IActionResult PostForm([FromForm] IEnumerable<int> values) =>
        Ok(new { Consumes = "application/x-www-form-urlencoded", Values = values });
}

Az előző kódban ConsumesController az URL-címre küldött https://localhost:5001/api/Consumes kérelmek kezelésére van konfigurálva. A vezérlő mindkét művelete, PostJson és PostForm, ugyanazzal az URL-címmel POST kéréseket kezel. [Consumes] A típuskorlátozást alkalmazó attribútum nélkül a rendszer nem egyértelmű egyezés-kivételt vet ki.

Az [Consumes] attribútum mindkét műveletre érvényes. A PostJson művelet a következő fejléccel Content-Typeapplication/jsonküldött kéréseket kezeli: . A PostForm művelet a következő fejléccel Content-Typeapplication/x-www-form-urlencodedküldött kéréseket kezeli: .

További erőforrások

[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase

Ne hozzon létre webes API-vezérlőt az Controller osztályból való származtatással. Controller ControllerBase származik, és támogatja a nézeteket, így a weblapok kezelésére szolgál, nem a webes API-kérelmekre. Kivételt képez ez a szabály: ha ugyanazt a vezérlőt szeretné használni a nézetekhez és a webes API-khoz is, származtathatja a következőből Controller: . A ControllerBase osztály számos olyan tulajdonságot és metódust biztosít, amelyek hasznosak a HTTP-kérések kezeléséhez. Például a ControllerBase.CreatedAtAction egy 201-es állapotkódot ad vissza.

[HttpPost]
[ProducesResponseType(StatusCodes.Status201Created)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
public ActionResult<Pet> Create(Pet pet)
{
    pet.Id = _petsInMemoryStore.Any() ? 
             _petsInMemoryStore.Max(p => p.Id) + 1 : 1;
    _petsInMemoryStore.Add(pet);

    return CreatedAtAction(nameof(GetById), new { id = pet.Id }, pet);
}

Íme néhány további példa azokra a módszerekre, amelyeket a ControllerBase biztosít.

Method Notes
BadRequest 400 állapotkódot ad vissza.
NotFound 404-es állapotkódot ad vissza.
PhysicalFile Egy fájlt ad vissza.
TryUpdateModelAsync Modellkötés meghívása.
TryValidateModel Modellérvényesítést hív meg.

Az összes elérhető metódus és tulajdonság listáját lásd ControllerBase: .

Attributes

A Microsoft.AspNetCore.Mvc névtér olyan attribútumokat biztosít, amelyek a webes API-vezérlők és műveleti módszerek viselkedésének konfigurálására használhatók. Az alábbi példa attribútumokkal adja meg a támogatott HTTP-műveleti parancsot és az esetlegesen visszaadható ismert HTTP-állapotkódokat:

[HttpPost]
[ProducesResponseType(StatusCodes.Status201Created)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
public ActionResult<Pet> Create(Pet pet)
{
    pet.Id = _petsInMemoryStore.Any() ? 
             _petsInMemoryStore.Max(p => p.Id) + 1 : 1;
    _petsInMemoryStore.Add(pet);

    return CreatedAtAction(nameof(GetById), new { id = pet.Id }, pet);
}

Íme néhány további példa az elérhető attribútumokra:

Attribute Notes
[Route] Egy vezérlő vagy művelet URL-mintázatát adja meg.
[Bind] Megadja a modellkötéshez felvenni kívánt előtagot és tulajdonságokat.
[HttpGet] A HTTP GET művelet igét támogató műveletet azonosít.
[Consumes] Megadja azokat az adattípusokat, amelyeket egy művelet elfogad.
[Produces] Megadja a művelet által visszaadott adattípusokat.

Az elérhető attribútumokat tartalmazó listákért tekintse meg a Microsoft.AspNetCore.Mvc névteret.

ApiController attribútum

Az [ApiController] attribútum egy vezérlőosztályra alkalmazható a következő véleményezett, API-specifikus viselkedések engedélyezéséhez:

Adott vezérlők attribútuma

Az [ApiController] attribútum adott vezérlőkre alkalmazható, ahogyan a projektsablon alábbi példájában is látható:

[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase

Attribútum több vezérlőn

Az attribútumot egynél több vezérlőn is használhatja, ha létrehoz egy egyéni alapvezérlőosztályt, amely az [ApiController] attribútummal van eljegyzve. Az alábbi példa egy egyéni alaposztályt és egy belőle származó vezérlőt mutat be:

[ApiController]
public class MyControllerBase : ControllerBase
{
}
[Produces(MediaTypeNames.Application.Json)]
[Route("api/[controller]")]
public class PetsController : MyControllerBase

Attribútum egy összeállításban

Ha a kompatibilitási verzió a 2.2-es vagy újabb verzióra van állítva, az [ApiController] attribútum alkalmazható egy szerelvényre. Az ilyen megjegyzések webes API-viselkedést alkalmaznak a szerelvény összes vezérlőjében. Az egyes vezérlők nem választhatók ki. Alkalmazza a szerelvényszintű attribútumot az osztályt körülvevő névtér-deklarációra Startup :

[assembly: ApiController]
namespace WebApiSample
{
    public class Startup
    {
        ...
    }
}

Attribútum alapú útválasztás követelmény

Az [ApiController] attribútum követelménysé teszi az attribútum-útválasztást. Például:

[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase

A műveletek nem érhetők el a hagyományos útvonalakon keresztül, amelyeket a UseMvc, UseMvcWithDefaultRoute vagy Startup.Configure határoz meg.

Automatikus HTTP 400-válaszok

Az [ApiController] attribútum automatikusan elindít egy HTTP 400-választ a modellérvényesítési hibák miatt. Ezért a következő kód szükségtelen egy műveletmetódusban:

if (!ModelState.IsValid)
{
    return BadRequest(ModelState);
}

ASP.NET Core MVC a ModelStateInvalidFilter műveletszűrővel hajtja végre az előző ellenőrzést.

Alapértelmezett BadRequest-válasz

A 2.1 kompatibilitási verziójával a HTTP 400-válaszok alapértelmezett választípusa a SerializableError. A szerializált típusra az alábbi kérelemtörzs mutat példát:

{
  "": [
    "A non-empty request body is required."
  ]
}

A 2.2-es vagy újabb kompatibilitási verzió esetén a HTTP 400-válaszok alapértelmezett választípusa.ValidationProblemDetails A szerializált típusra az alábbi kérelemtörzs mutat példát:

{
  "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
  "title": "One or more validation errors occurred.",
  "status": 400,
  "traceId": "|7fb5e16a-4c8f23bbfc974667.",
  "errors": {
    "": [
      "A non-empty request body is required."
    ]
  }
}

A ValidationProblemDetails típus:

Az automatikus és egyéni válaszok konzisztenssé tétele érdekében a ValidationProblem metódust hívja meg ahelyett, hogy BadRequest. ValidationProblem objektumot ad vissza ValidationProblemDetails -ként, valamint az automatikus választ is.

Automatikus 400 válasz naplózása

Lásd : Automatikus 400 válaszok naplózása modellérvényesítési hibák esetén (dotnet/AspNetCore.Docs#12157).

Automatikus 400-válasz letiltása

Az automatikus 400 viselkedés letiltásához állítsa a SuppressModelStateInvalidFilter tulajdonságot a következőre: true. Adja hozzá a következő kiemelt kódot a következőben Startup.ConfigureServices:

services.Configure<ApiBehaviorOptions>(options =>
{
    options.SuppressConsumesConstraintForFormFileParameters = true;
    options.SuppressInferBindingSourcesForParameters = true;
    options.SuppressModelStateInvalidFilter = true;
});

Kötés forrásparaméterének következtetése

A kötési forrásattribútum határozza meg azt a helyet, ahol egy műveleti paraméter értéke található. A következő kötési forrásattribútumok léteznek:

Attribute Kötés forrása
[FromBody] A kérés tartalma
[FromForm] Űrlap adat a kérelem törzsében
[FromHeader] Kérelem fejléce
[FromQuery] Lekérdezési sztring paraméter kérése
[FromRoute] Adatok átirányítása az aktuális kérelemből
[FromServices] A kérelemszolgáltatás műveletparaméterként injektálva

Warning

Ne használja [FromRoute] , ha az értékek tartalmazhatnak %2f (azaz /). %2f nem lesz feloldva / formátumra. Akkor használja [FromQuery] , ha az érték tartalmazhat %2f. Az ASP.NET Core futtatókörnyezet az [ApiController] vagy a kötési forrásattribútumok, mint [FromQuery], hiányában próbálja meg az összetett objektummodell-kötőt használni. Az összetett objektummodell-iratgyűjtő meghatározott sorrendben kér le adatokat az értékszolgáltatóktól.

Az alábbi példában az [FromQuery] attribútum azt jelzi, hogy a discontinuedOnly paraméter értéke a kérelem URL-címének lekérdezési sztringjében van megadva:

[HttpGet]
public ActionResult<List<Product>> Get(
    [FromQuery] bool discontinuedOnly = false)
{
    List<Product> products = null;

    if (discontinuedOnly)
    {
        products = _productsInMemoryStore.Where(p => p.IsDiscontinued).ToList();
    }
    else
    {
        products = _productsInMemoryStore;
    }

    return products;
}

Az [ApiController] attribútum következtetési szabályokat alkalmaz a műveleti paraméterek alapértelmezett adatforrásaira. Ezekkel a szabályokkal nem kell manuálisan azonosítania a kötési forrásokat, ha attribútumokat alkalmaz a műveleti paraméterekre. A kötési forrás következtetési szabályai az alábbiak szerint működnek:

  • [FromBody] összetett típusparaméterekre következtet. A következtetési szabály alól kivételt [FromBody] képez minden összetett, beépített típus, amely speciális jelentéssel rendelkezik, például IFormCollection és CancellationToken. A kötés forráskódja figyelmen kívül hagyja ezeket a speciális típusokat.
  • [FromForm] a függvény a következő típusú IFormFileIFormFileCollectionműveletparaméterekre következtet: Az egyszerű vagy felhasználó által definiált típusok esetében ez nem következik be.
  • [FromRoute] következtetés vonható le bármely műveletparaméter-névre, amely megfelel egy paraméternek az útvonalsablonban. Ha egynél több útvonal megfelel egy műveleti paraméternek, a rendszer minden útvonalértéket figyelembe veszi [FromRoute].
  • [FromQuery] következtetésre jut bármely más műveleti paraméter esetén.

FromBody következtetési megjegyzések

[FromBody] nem kerül kikövetkeztetésre egyszerű típusok esetén, mint például string vagy int. Ezért az [FromBody] attribútumot egyszerű típusokhoz kell használni, ha erre a funkcióra van szükség.

Ha egy művelethez egynél több paraméter van kötve a kérelemtörzsből, kivétel lép fel. Az alábbi műveletmetódus-aláírások például kivételt okoznak:

  • [FromBody] mindkettőre egyel következtetett, mert ezek összetett adattípusok.

    [HttpPost]
    public IActionResult Action1(Product product, Order order)
    
  • [FromBody] attribútum az egyiken, a másik pedig inferált, mert összetett típus.

    [HttpPost]
    public IActionResult Action2(Product product, [FromBody] Order order)
    
  • [FromBody] attribútum mindkét elemen található.

    [HttpPost]
    public IActionResult Action3([FromBody] Product product, [FromBody] Order order)
    

Note

Az ASP.NET Core 2.1-ben a gyűjteménytípusú paraméterek, például a listák és tömbök helytelenül vannak értelmezve [FromQuery]. Az [FromBody] attribútumot kell használni ezekhez a paraméterekhez, ha azokat a kérelemtörzsből kell keretemelni. Ez a viselkedés ASP.NET Core 2.2-es vagy újabb verziójában van javítva, ahol a gyűjteménytípus paramétereit a rendszer alapértelmezés szerint a törzstől köti.

Következtetési szabályok letiltása

A forráskötés következtetésének letiltásához állítsa be a SuppressInferBindingSourcesForParameters értéket true. Adja hozzá a következő kódot a Startup.ConfigureServices:

services.Configure<ApiBehaviorOptions>(options =>
{
    options.SuppressConsumesConstraintForFormFileParameters = true;
    options.SuppressInferBindingSourcesForParameters = true;
    options.SuppressModelStateInvalidFilter = true;
});

Többrészes/űrlapadat-kérelem következtetése

Az [ApiController] attribútum következtetési szabályt alkalmaz az IFormFile és IFormFileCollection típusú akcióparaméterekre. A multipart/form-data kérelem tartalomtípusa ezekre a típusokra következtet. Az alapértelmezett viselkedés letiltásához állítsa be a SuppressConsumesConstraintForFormFileParameters tulajdonságot a true értékre a(z) Startup.ConfigureServices alkalmazásában.

services.Configure<ApiBehaviorOptions>(options =>
{
    options.SuppressConsumesConstraintForFormFileParameters = true;
    options.SuppressInferBindingSourcesForParameters = true;
    options.SuppressModelStateInvalidFilter = true;
});

Hibaállapot-kódokkal kapcsolatos probléma részletei

Ha a kompatibilitási verzió 2.2-es vagy újabb, az MVC egy hibaeredményt (a 400-es vagy újabb állapotkódú eredményt) a következő eredményre ProblemDetailsalakítja át: . A ProblemDetails típus az RFC 7807 specifikáción alapul, amely géppel olvasható hibaadatokat biztosít egy HTTP-válaszban. Vegye figyelembe a következő kódot egy vezérlőműveletben:

if (pet == null)
{
    return NotFound();
}

A NotFound metódus egy HTTP 404-állapotkódot hoz létre egy ProblemDetails törzstel. Például:

{
  type: "https://tools.ietf.org/html/rfc7231#section-6.5.4",
  title: "Not Found",
  status: 404,
  traceId: "0HLHLV31KRN83:00000001"
}

ProblemDetails-válasz letiltása

A ProblemDetails hibaállapot-kódok automatikus létrehozása le van tiltva, ha a SuppressMapClientErrors tulajdonság true értékre van állítva. Adja hozzá a következő kódot a Startup.ConfigureServices:

Támogatott kérés tartalomtípusainak definiálása a [Felhasználások] attribútummal

Alapértelmezés szerint egy művelet támogatja az összes elérhető kérelemtartalomtípust. Ha például egy alkalmazás úgy van konfigurálva, hogy támogatja a JSON- és XML-bemeneti formátumkészítőket is, egy művelet több tartalomtípust is támogat, köztük application/json és application/xml.

A [Felhasználás] attribútum lehetővé teszi, hogy egy művelet korlátozza a támogatott kérelem tartalomtípusait. Alkalmazza az [Consumes] attribútumot egy műveletre vagy vezérlőre egy vagy több tartalomtípus megadásával:

[HttpPost]
[Consumes("application/xml")]
public IActionResult CreateProduct(Product product)

Az előző kódban a CreateProduct művelet megadja a tartalom típusát application/xml. Az ehhez a művelethez irányított kérelmeknek meg kell adniuk a Content-Type fejlécet.application/xml Azok a kérések, amelyek nem adnak meg Content-Typeapplication/xml fejlécet, 415 Nem támogatott médiatípus válasz eredményeznek. Az [Consumes] attribútum azt is lehetővé teszi, hogy egy művelet egy típuskényszer alkalmazásával egy bejövő kérelem tartalomtípusa alapján befolyásolja a kijelölést. Vegye figyelembe a következő példát:

[ApiController]
[Route("api/[controller]")]
public class ConsumesController : ControllerBase
{
    [HttpPost]
    [Consumes("application/json")]
    public IActionResult PostJson(IEnumerable<int> values) =>
        Ok(new { Consumes = "application/json", Values = values });

    [HttpPost]
    [Consumes("application/x-www-form-urlencoded")]
    public IActionResult PostForm([FromForm] IEnumerable<int> values) =>
        Ok(new { Consumes = "application/x-www-form-urlencoded", Values = values });
}

Az előző kódban ConsumesController az URL-címre küldött https://localhost:5001/api/Consumes kérelmek kezelésére van konfigurálva. A vezérlő mindkét művelete, PostJson és PostForm, ugyanazzal az URL-címmel POST kéréseket kezel. [Consumes] A típuskorlátozást alkalmazó attribútum nélkül a rendszer nem egyértelmű egyezés-kivételt vet ki. Az [Consumes] attribútum mindkét műveletre érvényes. A PostJson művelet a következő fejléccel Content-Typeapplication/jsonküldött kéréseket kezeli: . A PostForm művelet a következő fejléccel Content-Typeapplication/x-www-form-urlencodedküldött kéréseket kezeli: .

További erőforrások