Erkunden des Routings in der Web-API

Die ASP.Net-Web-API ist ein kompaktes Framework zum Erstellen zustandsloser HTTP-Dienste. Mithilfe der Web-API können Sie RESTful-Services entwerfen und implementieren, die unter HTTP ausgeführt werden. REST ist ein Architekturstil - eine Reihe von Einschränkungen, die zum Implementieren zustandsloser Dienste verwendet werden. Die Web-API ist bereits zur Technologie der Wahl für den Aufbau leichter HTTP-Dienste geworden. In diesem Beitrag werde ich eine Diskussion darüber präsentieren, wie das Routing in der Web-API funktioniert.

Wenn Sie ein Web-API-Projekt in Visual Studio erstellen, stellen Sie fest, dass auch ein MVC-Projekt erstellt wird. Ähnlich wie bei ASP.Net MVC wird die Routing-Konfiguration in einem Web-API-Projekt aus der Datei Global.asax aufgerufen. In einem Web-API-Projekt werden die Konfigurationsinformationen in den Klassen RouteConfig und WebApiConfig gespeichert. Beide sind im Ordner Application_Start vorhanden. Ähnlich wie bei einem MVC-Projekt würden Sie eine RouteConfig.cs-Datei beobachten, die im Ordner App_Start in Ihrer Lösung erstellt wurde.

Ein Controller in der Web-API ist für die Verarbeitung von HTTP-Anforderungen verantwortlich. Die öffentlichen Methoden des Controllers werden als Aktionsmethoden bezeichnet. Sobald eine Anforderung empfangen wurde, leitet die Web-API-Laufzeit die Anforderung an die entsprechende Aktion weiter, um die Anforderung zu verarbeiten. Um zu bestimmen, welche Aktion aufgerufen werden soll, nutzt die Web-API-Laufzeit eine Routing-Tabelle. Im Gegensatz zu einer typischen ASP.Net MVC-Anwendung leitet die Web-API-Laufzeit die eingehenden Anforderungen an den entsprechenden Controller weiter, indem das HTTP-Verb der Anforderung mit der entsprechenden Aktionsmethode abgeglichen wird.

Mit ASP.Net 5 (wird in Kürze als Teil von Visual Studio 2015 veröffentlicht) gibt es ein einheitliches Kernframework - Sie haben ein einzelnes Outing-Framework, ein einzelnes Modellbindungsframework und eine Ein-Filter-Pipeline. Sie haben jetzt einen einheitlichen Kern für ASP.Net MVC, ASP.Net Web API und ASP.Net Web Pages. Daher gibt es jetzt nur noch einen Controllertyp für die Verarbeitung von Anforderungen: Dies gilt für Ihre ASP.Net MVC-, ASP.Net Web API- und ASP.Net-Anwendungen.

Die Standard-MVC-Routenvorlage sieht folgendermaßen aus:

{controller} / {action} / {id}

Im Gegensatz dazu sieht die Standard-Web-API-Route folgendermaßen aus:

api/{controller}/{id}

The default route created when you create a new Web API project in Visual Studio looks like this:

public static class WebApiConfig

{

public static void Register(HttpConfiguration config)

{

config.Routes.MapHttpRoute(

name: "DefaultApi",

routeTemplate: "api/{controller}/{id}",

defaults: new { id = RouteParameter.Optional }

);

}

}

Note how the default route is prefixed by "api". It is a good practice to define the routes of your Web API application by prefixing them with "api" to make them distinct from the standard MVC route. On a different note, when you look at the default route for a Web API project, you wouldn't see the "{action}" route parameter -- the Web API runtime maps requests to the appropriate actions based on the HTTP verb of the requests.

However, you can modify the Web API route definition to include an "{action}" parameter. The following code snippet illustrates how the modified WebApiConfig class looks like.

public static class WebApiConfig

{

public static void Register(HttpConfiguration config)

{

config.Routes.MapHttpRoute(

name: "DefaultApi",

routeTemplate: "api/{controller}/{action}/{id}",

defaults: new { id = RouteParameter.Optional }

);

}

}

Now that you have specified "{action}" as part of the route, you need to specify the action when invoking the WebAPI method. Consider the following URL: //idgservice/authors/1

In this URL, idgservice is the name of the domain where the WebAPI has been hosted, authors is the controller name, and 1 is passed as a parameter. However, this wouldn't work if you have defined "{action}" in your route definition. You would need to explicitly mention the action name when calling your WebAPI this this case. Here's the correct URL that includes the action name as part of the URL: //idgservice/authors/GetAuthorDetails/

Note that the action name in the above URL is GetAuthorDetails and has been mentioned as part of the modified URL.

You can also specify the HTTP method for an action using the HttpGet, HttpPut, HttpPost, or HttpDelete attribute. The code snippet given below illustrates how this can be achieved:

public class AuthorsController : ApiController

{

[HttpGet]

public Author GetAuthor(id) {}

}

If you would like to allow multiple HTTP methods for an action, you can take advantage of the AcceptVerbs attribute as shown below:

public class ProductsController : ApiController

{

[AcceptVerbs("GET", "HEAD")]

public Author GetAuthor(id) { }

}

You can also override the action using the ActionName attribute as shown in the code snippet given below:

public class AuthorsController : ApiController

{

[HttpGet]

[ActionName("AuthorDetails")]

public Author GetAuthor(id) {}

}

Note that you can also prevent a method from being invoked as an action by leveraging the NonAction attribute as shown below.

public class AuthorsController : ApiController

{

[HttpGet]

[NonAction]

public Boolean ValidateLogin(id) {}

}