Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
679 views
in Technique[技术] by (71.8m points)

c# - AspNet core web Api usage of ApiControllerAttribute

When I create a new controller in the API project, it generates a controller class with [ApiController] attribute, like this:

[ApiController]
public class TestController : ControllerBase
{
 //implementation
}

I've seen a few webapi projects where usage of this attribute is omitted. Microsoft documentation here says:

Indicates that a type and all derived types are used to serve HTTP API responses. The presence of this attribute can be used to target conventions, filters and other behaviors based on the purpose of the controller.

But still, I don't get the idea. Can someone explain what is the purpose of this attribute with the real-life example?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

This is well-explained in the docs: Annotation with ApiController attribute, which explains that adding the [ApiController] attribute to a controller does the following:

  1. Automatic HTTP 400 responses

    Adds an action filter that returns a 400 response if ModelState.IsValid is false.

  2. Binding source parameter inference

    Changes model-binding conventions. For example, [FromBody] is inferred for complex-type parameters.

  3. Multipart/form-data request inference

    Infers a Content-Type of multipart/form-data for parameters marked with [FromForm].

  4. Attribute routing requirement

    Mandates that all actions must be attribute-routed.

You can see how this is actually done in the source:

foreach (var actionModel in controllerModel.Actions)
{
    if (!isApiController && !actionModel.Attributes.OfType<IApiBehaviorMetadata>().Any())
    {
        continue;
    }

    EnsureActionIsAttributeRouted(controllerHasSelectorModel, actionModel);
    AddInvalidModelStateFilter(actionModel);
    InferParameterBindingSources(actionModel);
    InferParameterModelPrefixes(actionModel);
    AddMultipartFormDataConsumesAttribute(actionModel);
}

If you're not interested in any of the features described above, you can omit the attribute. It's also possible to suppress individual features by configuring the ApiBehaviorOptions class.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...