2013-09-06 8 views
12

Ho bisogno di un controller per restituire JSON per essere utilizzato da JavaScript, quindi ho ereditato dalla classe ApiController ma non si comporta come mi aspettavo. Il libro Apress Pro ASP.NET MVC 4 e la maggior parte degli esempi online che ho trovato dare esempi come:Percorso dell'API Web al nome dell'azione

public class ServicesController : ApiController 
{ 
    public string[] MethodFruit() 
    { 
     return new string[] { "Apple", "Orange", "Banana" }; 
} 

accessibile tramite l'URL:

http://mysite/services/methodfruit 

Ma questo non funziona mai - l'isn risorsa trovato L'unico approccio che posso ottenere di lavoro è quello di avere il controller contiene un metodo diverso per ogni verbo HTTP, quindi:

http://mysite/api/services 

che chiama il metodo GET.

Ho controllato il sito Web di Apress ma non sembrano avere alcun forum e il codice sorgente corrente è in VS 2012 che non sto utilizzando. Ho esaminato i file di origine e sembrano pensare che il primo approccio dovrebbe funzionare. Il precedente approccio non è più supportato?

risposta

27

Sì ... in genere è necessario seguire la convenzione di denominazione predefinita prevista dall'API Web ASP.NET.

controllare questo documento ufficiale:

Routing in ASP.NET Web API

Se non si desidera seguire la convenzione, si può provare il Routing da Azione Nome sezione descritta nel documento sopra collegato.

Routing dall'azione Nome

Con il modello di routing di default, API Web utilizza il metodo HTTP per selezionare l'azione. Tuttavia, è anche possibile creare un percorso in cui il nome azione è incluso nel URI:

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

Nel tuo caso, dovreste fare questo:

[HttpGet] 
public string[] MethodFruit() 
{ 
    return new string[] { "Apple", "Orange", "Banana" }; 
} 
+0

Grazie. Leggerò quel documento. – David

+1

Ho fatto la stessa cosa. Ma voglio ottenere questa funzione chiamata su richiesta 'POST'. Ho aggiunto '{action}' nel percorso e aggiunto '[AcceptVerbs (" GET "," POST ")]' invece di '[HttpGet]'. Ma dice 404 quando si accede a questa API facendo una richiesta di posta. Quando non ci sono problemi con 'GET'. Il mio nome di azione è 'GetAuthToken'. Non riesco davvero a risolverlo. Per favore aiuto. – shashwat

+0

@shashwat controlla se questo risolve il tuo problema: http://stackoverflow.com/a/12766431/114029 –

6

Se si desidera Web API per cercare il nome azione quando il routing, modificare la classe WebApiConfig.cs nella cartella App_Start a questo:

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

Poi si può j Ust fare una richiesta GET a

http://mysite/api/Services/MethodFruit 
+0

Mi sono perso il WebApiConfig. classe cs interamente. Ha molto più senso ora - mi chiedevo perché la classe RouteConfig non fosse cambiata ... – David

4

sto aggiungendo ulteriori informazioni sulla risposta di cui sopra .. Aggiunta RoutePrefix risolverà il problema ..Speranza che aiuta

controller

[RoutePrefix("api/Services")] 
    public class ServicesController : ApiController 
    { 
     [System.Web.Http.AcceptVerbs("GET", "POST")] 
     [System.Web.Http.HttpGet] 
     [Route("MethodFruit")] 
     public string[] MethodFruit() 
     { 
      return new string[] { "Apple", "Orange", "Banana" }; 
     } 
    } 

in config

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

Usare [RoutePrefix ("api/referencedata")] e [Route ("prodotti")] sul metodo di azione era l'unica cosa quello ha funzionato per me. Errore quando ho usato [Route ("api/referencedata")] [ActionName ("prodotti")] – MartinS

0

stavo affrontando lo stesso problema, ho scoperto che il mio codice

using System.Web.Mvc; 

ho importato MVC intenzione di usare System.Web.Http. quindi stava usando il routing Mvc non via webApi. ho sostituito quello con

using System.Web.Http 

e funziona per me. sto aggiungendo la mia risposta così i principianti non ripeteranno lo stesso errore

Problemi correlati