Ricerca…


Come funziona il routing in asp.net webapi

Nell'API Web ASP.NET, un controller è una classe che gestisce le richieste HTTP. I metodi pubblici del controller sono chiamati metodi di azione o semplicemente azioni.

Quando il framework API Web riceve una richiesta, indirizza la richiesta a un'azione. Per determinare quale azione invocare, il framework utilizza una tabella di routing. Il modello di progetto di Visual Studio per Web API crea una route predefinita:

routes.MapHttpRoute(
    name: "API Default",
    routeTemplate: "**api/{controller}/{id}**",
    defaults: new { id = RouteParameter.Optional }
);

Questa route è definita nel file WebApiConfig.cs, che viene inserito nella directory App_Start: inserisci la descrizione dell'immagine qui

Ogni voce nella tabella di routing contiene un modello di percorso. Il modello di route predefinito per l'API Web è " api / {controller} / {id} ". In questo modello, " api " è un segmento di percorso letterale e { controller } e { id } sono variabili segnaposto.

Quando il framework API Web riceve una richiesta HTTP, prova a far corrispondere l'URI con uno dei modelli di instradamento nella tabella di routing. Se nessuna route corrisponde, il client riceve un errore 404.

Ad esempio, i seguenti URI corrispondono alla route predefinita:

  • / API / valori
  • / Api / valori / 1

Tuttavia, il seguente URI non corrisponde, perché manca il segmento " api ":

  • / Valori / 1

Una volta trovata una rotta corrispondente, l'API Web seleziona il controller e l'azione:

  • Per trovare il controller, l'API Web aggiunge "Controller" al valore della variabile {controller}.
  • Per trovare l'azione, l'API Web esamina il metodo HTTP e quindi cerca un'azione il cui nome inizia con il nome del metodo HTTP. Ad esempio, con una richiesta GET, l'API Web cerca un'azione che inizia con "Get ...", come "GetEmployee" o "GetAllEmployees". Questa convenzione si applica solo ai metodi GET, POST, PUT e DELETE.

È possibile abilitare altri metodi HTTP utilizzando gli attributi sul controller. Ne vedremo un esempio dopo.

  • Altre variabili segnaposto nel modello di percorso, come {id}, sono mappate ai parametri di azione.

Metodi HTTP Invece di utilizzare la convenzione di denominazione per i metodi HTTP, è possibile specificare esplicitamente il metodo HTTP per un'azione decorando il metodo di azione con l'attributo HttpGet, HttpPut, HttpPost o HttpDelete.

Nell'esempio seguente, il metodo EmployeeGetEmployee viene associato alle richieste GET:

 public class EmployeesController : ApiController
    {
        [HttpGet]
        public EmployeeGetEmployee(id) {}
    }   

Per consentire più metodi HTTP per un'azione o per consentire metodi HTTP diversi da GET, PUT, POST e DELETE, utilizzare l'attributo AcceptVerbs, che accetta un elenco di metodi HTTP.

public class EmployeesController: ApiController
{
    [AcceptVerbs("GET", "HEAD")]
    public Employee GetEmployee (id) { }
}

Routing per nome dell'azione

Con il modello di instradamento predefinito, l'API Web utilizza il metodo HTTP per selezionare l'azione. Tuttavia, puoi anche creare una rotta in cui il nome dell'azione è incluso nell'URI:

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

In questo modello di percorso, il parametro {action} indica il metodo di azione sul controller. Con questo stile di routing, utilizzare gli attributi per specificare i metodi HTTP consentiti. Ad esempio, supponiamo che il controller abbia il seguente metodo:

public class EmployeesController: ApiController
{
    [HttpGet]
    public List<Employee> GetAllEmployees();
}

In questo caso, una richiesta GET per " api / Employees / GetAllEmployees " si assocerebbe al metodo GetAllEmployees.

Puoi sovrascrivere il nome dell'azione usando l'attributo ActionName. Nell'esempio seguente, esistono due azioni che si associano a " api / Employees / ShowAllEmployees / id . Uno supporta GET e l'altro supporta POST:

public class EmployeesController : ApiController
{
    [HttpGet]
    [ActionName("ShowAllEmployees")]
    public List<Employee> GetAll(int id);

    [HttpPost]
    [ActionName("ShowAllEmployees")]
    public void GetAll (int id);

}

Non-azioni

È possibile impedire che un metodo venga richiamato come azione utilizzando l'attributo NonAction. Questo segnala al framework che il metodo non è un'azione, anche se altrimenti corrisponderebbe alle regole di routing.

 [NonAction]  
public string GetValues() { ... }

Esempi di routing basati sui verbi.

Lo stesso URl per diversi metodi http agisce in modo diverso. Di seguito è riportata una tabella raffigurante la stessa.

VERBO HTTP URL DESCRIZIONE
OTTENERE / API / studenti Restituisce tutti gli studenti
OTTENERE / API / studenti / 5 Restituisce i dettagli dell'ID studente = 5
INVIARE / API / studenti Aggiungi un nuovo studente
METTERE / API / studenti / 5 Aggiorna studente con Id = 5
ELIMINA / API / studenti / 5 Elimina studente con Id = 5


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow