web-dev-qa-db-fra.com

Comment ajouter des méthodes personnalisées au contrôleur ASP.NET WebAPI?

Dans ASP.NET MVC WebAPI projet par défaut, nous avons créé le contrôleur suivant

 public class ValuesController : ApiController
    {
        // GET api/values
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }

        // GET api/values/5
        public string Get(int id)
        {
            return "value";
        }

        // POST api/values
        public void Post([FromBody]string value)
        {
        }

        // PUT api/values/5
        public void Put(int id, [FromBody]string value)
        {
        }

        // DELETE api/values/5
        public void Delete(int id)
        {
        }
}

Mais est-il possible d'ajouter ici des méthodes personnalisées afin qu'elles puissent également prendre en charge get/post?

Je vous remercie!

23
Developer

Vous pouvez utiliser des attributs tels que RoutePrefix avec le type Http.

[Route("ChangePassword")]
[HttpPost] // There are HttpGet, HttpPost, HttpPut, HttpDelete.
public async Task<IHttpActionResult> ChangePassword(ChangePasswordModel model)
{        
}

Le type http le mappera à sa méthode correcte en combinaison avec le nom de la route.

18
Shawn Mclean

Je ne suis pas sûr de suivre car vous avez GET et POST juste là dans votre code, mais en tout cas vous avez d'autres options:

Option 1

Tout d'abord, vous pouvez configurer vos itinéraires personnalisés dans le App_Start dossier dans le WebApiConfig.cs fichier. Voici ce que j'utilise normalement:

    // GET /api/{resource}/{action}
    config.Routes.MapHttpRoute(
        name: "Web API RPC",
        routeTemplate: "{controller}/{action}",
        defaults: new { },
        constraints: new { action = @"[A-Za-z]+", httpMethod = new HttpMethodConstraint("GET") }
        );

    // GET|PUT|DELETE /api/{resource}/{id}/{code}
    config.Routes.MapHttpRoute(
        name: "Web API Resource",
        routeTemplate: "{controller}/{id}/{code}",
        defaults: new { code = RouteParameter.Optional },
        constraints: new { id = @"\d+" }
        );

    // GET /api/{resource}
    config.Routes.MapHttpRoute(
        name: "Web API Get All",
        routeTemplate: "{controller}",
        defaults: new { action = "Get" },
        constraints: new { httpMethod = new HttpMethodConstraint("GET") }
        );

    // PUT /api/{resource}
    config.Routes.MapHttpRoute(
        name: "Web API Update",
        routeTemplate: "{controller}",
        defaults: new { action = "Put" },
        constraints: new { httpMethod = new HttpMethodConstraint("PUT") }
        );

    // POST /api/{resource}
    config.Routes.MapHttpRoute(
        name: "Web API Post",
        routeTemplate: "{controller}",
        defaults: new { action = "Post" },
        constraints: new { httpMethod = new HttpMethodConstraint("POST") }
        );

    // POST /api/{resource}/{action}
    config.Routes.MapHttpRoute(
        name: "Web API RPC Post",
        routeTemplate: "{controller}/{action}",
        defaults: new { },
        constraints: new { action = @"[A-Za-z]+", httpMethod = new HttpMethodConstraint("POST") }
        );

J'utilise une combinaison de points de terminaison RESTful ainsi que de points de terminaison RPC. Pour certains puristes, c'est le motif d'une guerre sainte. Pour moi, j'utilise une combinaison des deux parce que c'est une combinaison puissante et je ne trouve aucune raison sensée de ne pas le faire.

Option 2

Comme les autres l'ont souligné et comme je le fais moi-même de nos jours, utilisez le routage d'attributs:

    [HttpGet]
    [GET("SomeController/SomeUrlSegment/{someParameter}")]
    public int SomeUrlSegment(string someParameter)
    {
        //do stuff
    }

J'avais besoin d'un package NuGet pour le routage d'attributs pour que cela fonctionne (recherchez simplement NuGet pour "Routage d'attributs"), mais je pense que MVC 5/WebAPI 2 l'a nativement.

J'espère que cela t'aides.

14
Matt Cashatt

Vous pouvez utiliser le routage d'attributs:

[Route("customers/{customerId}/orders")]
public IEnumerable<Order> GetOrdersByCustomer(int customerId) { ... }

Quelques documents pour vous aider à démarrer:

http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2

11
Iain

Mettez d'abord cette route vers webapiconfig.cs

config.Routes.MapHttpRoute(
            name: "ApiWithAction",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

Vous pouvez maintenant ajouter des actions à vos contrôleurs comme ceci

 [HttpPost]
    public void Upload()
    {
           //Do some thing
    }

J'ai décoré l'action de téléchargement avec l'attribut httppost, ce qui signifie que cette action accepte uniquement les demandes de publication, si vous souhaitez que les actions soient GET, vous pouvez supprimer l'attribut ou simplement décorer votre suite

1
elia07