2012-06-12 22 views
5

Web API sembra essere adatto solo per i casi d'uso standard. Ma voglio fare un routing più complesso ma non riesco a trovare la documentazione per il routing complesso. Se ho più controller, i percorsi diventano sempre più complicati.ASP.NET 4 MVC Web API: documentazione per instradamento complesso

Posso definire più parametri opzionali con dipendenze? Ti piace questa:

/api/document/{par1}/{par2} 

par1 & par2 dovrebbe essere facoltativo, ma par2 dovrebbero essere abbinati solo se par1 è presente.

E i parametri ricorsivi sono possibili?

/api/documents/characteristics/{round/green/red-dots} 
/api/documents/characteristics/{square/yellow} 
/api/documents/characteristics/{square/yellow/flat} 
/api/documents/characteristics/{square/yellow/flat/...} 

Esiste una documentazione dettagliata per il routing dell'API Web? Il tutorial di microsoft è troppo semplice ... Ho bisogno di ulteriori informazioni sul routing.

Ho due controller e qualche problema perché due routing sono abbastanza simili, quindi viene presa la rotta sbagliata. Posso usare [Azione] -Attributo come soluzione alternativa, ma non mi sembra giusto ... Devo anche considerare l'ordine dei percorsi. Questo è logico ma non viene menzionato da nessuna parte. La web API è solo per le semplici pause?


Modifica: ho provato questo:

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

//routes.MapHttpRoute(
// name: "DefaultApiWithAction", 
// routeTemplate: "api/{mandant}/documents/{id}/{action}", 
// defaults: new { controller = "documents" } 
// ); 

Ho due metodi:

[AcceptVerbs("get")] 
public HttpResponseMessage Get(int id) 

[ActionName("file")] 
[AcceptVerbs("get")] 
public HttpResponseMessage filedownload(int id) 

ora ho il problema, il file-azione viene attivata anche se io commenta il secondo percorso e il normale metodo di acquisizione del documento specifico non viene attivato perché più azioni ... Ho provato l'attributo [NoAction] ma questo i s non funziona ... Ma perché il metodo file verrà attivato se non vi è alcuna azione nel modello di percorso? (O se la seconda rotta è attiva, perché il normale metodo get-document non verrà attivato se non c'è azione nell'url ....) I la mia soluzione corrente è impostare un'azione predefinita per tutti gli altri metodi, ma questa non è una buona soluzione.

risposta

8

È possibile utilizzare i vincoli di routing per impostare le condizioni sul percorso in global.asax come:

routes.MapRoute(
    "ApiRoute", 
    "api/document/{par1}/{par2}", 
    new {controller="Document", action="SomeMethod"}, 
    new {par1 = @"\d+" } 
); 

In ultimo parametro è possibile specificare un'espressione regolare che deve essere abbinato per il parametro specificato per il percorso di essere Usato. Nell'esempio di cui sopra par1 viene utilizzato solo per le cifre, ma è possibile utilizzare qualsiasi espressione regolare, come:

routes.MapRoute(
    "ApiRoute", 
    "api/document/{par1}/{par2}", 
    new {controller="Document", action="SomeMethod"}, 
    new {par1 = @"(value1|value2|value3)" } 
); 
+0

Impostazione del regolatore statico di default dovrebbe gestire i conflitti di percorso. Il fatto che tu possa usare i vincoli è nuovo per me. Grazie. Una buona documentazione Microsoft per il routing Web API sarebbe ottima. Ho anche scoperto che puoi usare il * come parametro catch-all come questo {* param} ma deve essere alla fine dell'URL. – user437899

+2

Ho trovato questo documento generico per il routing di asp.net: http://msdn.microsoft.com/en-us/library/cc668201.aspx – user437899

Problemi correlati