asp.net-web-api
Web-API-URL-Routing
Suche…
Funktionsweise des Routings in asp.net webapi
In ASP.NET-Web-API ist ein Controller eine Klasse, die HTTP-Anforderungen verarbeitet. Die öffentlichen Methoden des Controllers werden als Aktionsmethoden oder einfach als Aktionen bezeichnet.
Wenn das Web-API-Framework eine Anforderung empfängt, leitet es die Anforderung an eine Aktion weiter. Um zu bestimmen, welche Aktion aufgerufen werden soll, verwendet das Framework eine Routing-Tabelle. Die Visual Studio-Projektvorlage für Web-API erstellt eine Standardroute:
routes.MapHttpRoute(
name: "API Default",
routeTemplate: "**api/{controller}/{id}**",
defaults: new { id = RouteParameter.Optional }
);
Diese Route ist in der Datei WebApiConfig.cs definiert, die sich im Verzeichnis App_Start befindet:
Jeder Eintrag in der Routingtabelle enthält eine Routenvorlage. Die Standard-Routenvorlage für die Web-API lautet " api / {controller} / {id} ". In dieser Vorlage ist " api " ein Literalpfadsegment und { Controller } und { ID } sind Platzhaltervariablen.
Wenn das Web-API-Framework eine HTTP-Anforderung empfängt, versucht es, den URI mit einer der Routenvorlagen in der Routingtabelle abzugleichen. Wenn keine Route passt, erhält der Client einen Fehler 404.
Beispielsweise stimmen die folgenden URIs mit der Standardroute überein:
- / api / values
- / api / values / 1
Der folgende URI stimmt jedoch nicht überein, da ihm das Segment " api " fehlt:
- / Werte / 1
Sobald eine übereinstimmende Route gefunden wurde, wählt das Web-API den Controller und die Aktion aus:
- Um den Controller zu finden, fügt das Web-API dem Wert der Variablen {controller} "Controller" hinzu.
- Um die Aktion zu finden, prüft das Web-API die HTTP-Methode und sucht dann nach einer Aktion, deren Name mit diesem HTTP-Methodennamen beginnt. Bei einer GET-Anforderung sucht das Web-API beispielsweise nach einer Aktion, die mit "Get ..." beginnt, beispielsweise "GetEmployee" oder "GetAllEmployees". Diese Konvention gilt nur für die Methoden GET, POST, PUT und DELETE.
Sie können andere HTTP-Methoden aktivieren, indem Sie Attribute in Ihrem Controller verwenden. Wir werden später ein Beispiel sehen.
- Andere Platzhaltervariablen in der Routenvorlage, z. B. {id}, werden Aktionsparametern zugeordnet.
HTTP-Methoden Anstatt die Namenskonvention für HTTP-Methoden zu verwenden, können Sie die HTTP-Methode für eine Aktion explizit angeben, indem Sie die Aktionsmethode mit dem Attribut HttpGet, HttpPut, HttpPost oder HttpDelete dekorieren.
Im folgenden Beispiel wird die EmployeeGetEmployee-Methode den GET-Anforderungen zugeordnet:
public class EmployeesController : ApiController
{
[HttpGet]
public EmployeeGetEmployee(id) {}
}
Um mehrere HTTP-Methoden für eine Aktion zuzulassen, oder um andere HTTP-Methoden als GET, PUT, POST und DELETE zuzulassen, verwenden Sie das AcceptVerbs-Attribut, das eine Liste von HTTP-Methoden verwendet.
public class EmployeesController: ApiController
{
[AcceptVerbs("GET", "HEAD")]
public Employee GetEmployee (id) { }
}
Routing nach Aktionsname
Bei der Standardroutingvorlage verwendet das Web-API die HTTP-Methode, um die Aktion auszuwählen. Sie können jedoch auch eine Route erstellen, bei der der Aktionsname im URI enthalten ist:
routes.MapHttpRoute(
name: "ActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
In dieser Routenvorlage benennt der Parameter {action} die Aktionsmethode auf dem Controller. Verwenden Sie bei diesem Routingstil Attribute, um die zulässigen HTTP-Methoden anzugeben. Angenommen, Ihr Controller hat die folgende Methode:
public class EmployeesController: ApiController
{
[HttpGet]
public List<Employee> GetAllEmployees();
}
In diesem Fall würde eine GET-Anforderung für " api / Employees / GetAllEmployees " der Methode GetAllEmployees zugeordnet.
Sie können den Aktionsnamen mit dem ActionName-Attribut überschreiben. Im folgenden Beispiel gibt es zwei Aktionen, die " api / Employees / ShowAllEmployees / id" zugeordnet sind . Eine unterstützt GET und die andere POST:
public class EmployeesController : ApiController
{
[HttpGet]
[ActionName("ShowAllEmployees")]
public List<Employee> GetAll(int id);
[HttpPost]
[ActionName("ShowAllEmployees")]
public void GetAll (int id);
}
Nicht-Aktionen
Wir können verhindern, dass eine Methode als Aktion aufgerufen wird, indem Sie das NonAction-Attribut verwenden. Dies signalisiert dem Framework, dass die Methode keine Aktion ist, auch wenn sie sonst den Routing-Regeln entsprechen würde.
[NonAction]
public string GetValues() { ... }
Verb-basierte Routing-Beispiele.
Die gleiche URL für verschiedene http-Methoden verhält sich unterschiedlich. Unten ist eine Tabelle, die dasselbe darstellt.
| HTTP VERB | URL | BESCHREIBUNG |
|---|---|---|
| ERHALTEN | / api / studenten | Gibt alle Schüler zurück |
| ERHALTEN | / api / students / 5 | Gibt Details der Schüler-ID = 5 zurück |
| POST | / api / studenten | Einen neuen Schüler hinzufügen |
| STELLEN | / api / students / 5 | Schüler mit Id = 5 aktualisieren |
| LÖSCHEN | / api / students / 5 | Schüler mit Id = 5 löschen |