Esplorazione del routing nell'API Web

L'API Web ASP.Net è un framework leggero utilizzato per la creazione di servizi HTTP senza stato. È possibile utilizzare l'API Web per progettare e implementare servizi RESTful eseguiti su HTTP. REST è uno stile architettonico, un insieme di vincoli utilizzati per implementare servizi senza stato. L'API Web è già diventata la tecnologia preferita per la creazione di servizi HTTP leggeri. In questo post, presenterò una discussione su come funziona il routing nell'API Web.

Quando crei un progetto API Web in Visual Studio, osserverai che viene creato anche un progetto MVC. Simile a ASP.Net MVC, la configurazione del routing in un progetto API Web viene richiamata dal file Global.asax. Un progetto API Web memorizza le informazioni di configurazione nelle classi RouteConfig e WebApiConfig, entrambe presenti nella cartella Application_Start. Simile a un progetto MVC, osserveresti un file RouteConfig.cs creato nella cartella App_Start nella tua soluzione.

Un controller nell'API Web è responsabile della gestione delle richieste HTTP. I metodi pubblici del controller sono noti come metodi di azione. Non appena viene ricevuta una richiesta, il runtime dell'API Web instrada la richiesta all'azione appropriata per gestire la richiesta. Ora, per determinare quale azione deve essere richiamata, il runtime dell'API Web si avvale di una tabella di instradamento. A differenza di una tipica applicazione ASP.Net MVC, il runtime dell'API Web instrada le richieste in ingresso al controller appropriato facendo corrispondere il verbo HTTP della richiesta al metodo di azione appropriato.

Con ASP.Net 5 (che verrà rilasciato a breve come parte di Visual Studio 2015), è disponibile un framework di base unificato: si dispone di un unico framework di uscita, un unico framework di associazione di modelli e una pipeline con un filtro. Ora hai un core unificato per ASP.Net MVC, ASP.Net Web API e ASP.Net Web Pages. Quindi, ora esiste un solo tipo di controller per gestire le richieste: è comune alle applicazioni ASP.Net MVC, ASP.Net Web API e ASP.Net.

Il modello di route MVC predefinito ha questo aspetto:

{controller} / {action} / {id}

Al contrario, la route API Web predefinita è simile a questa:

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) {}

}