33 messaggi dal 10 maggio 2015
Ciao a tutti,
ho un'applicazione MVC5 che, al suo interno, ha anche dei controller WebApi 2. Il problema è che non riesco ad utilizzare le api perché, se provo a chiamarle dal client, ricevo un 404.

Questo il codice del metodo che provo a chiamare:

    public class AgentiController : ApiController
    {
        [HttpGet]
        [Route("api/agenti/get-single/{id}")]
        [ResponseType(typeof(AjaxRecordResponse<AGENTE>))]
        public AjaxRecordResponse<AGENTE> GetSingle(int id)
        {
            return new AjaxRecordResponse<AGENTE>(AjaxResponseCode.OK, " ", ctx.AGENTE.Find(id));
        }
    }


Questo il file di configurazione delle regole di routing delle api:
    public class WebApiRouteConfig
    {
        public static void RegisterRoutes(HttpConfiguration config)
        {
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{action}/{param}",
                defaults: new { param = RouteParameter.Optional }
            );
        }
    }


Infine, questo il Global.asax:

    public class MvcApplication : HttpApplication
    {
        protected void Application_Start()
        {
         WebApiRouteConfig.RegisterRoutes(GlobalConfiguration.Configuration);   
            RouteConfig.RegisterRoutes(RouteTable.Routes);                          
            BundleConfig.RegisterBundle(BundleTable.Bundles);                       
        }
    }


Sto dimenticando/sbagliando qualcosa?
Ringrazio in anticipo.
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,


Questo il file di configurazione delle regole di routing delle api:

Non ha molta importanza quale sia la route di default perché sulla tua action GetSingle hai posto l'attributo [Route] che ridefinisce quella regola.

Tu con quale url stai cercando di raggiungere quella action?
Dovresti provare con:
/api/agenti/get-single/1


Inoltre, dovresti documentare la tua API con Swagger così è più facile anche per capire come vanno invocate le action.
http://www.aspitalia.com/script/1205/Documentare-ASP.NET-Web-API-Swagger.aspx

ciao,
Moreno

Enjoy learning and just keep making
33 messaggi dal 10 maggio 2015
Ciao Moreno,
grazie per la risposta.

L'url con il quale sto provando ad accede alla api è il seguente:

http://[host]/api/agenti/get-single/15

ovvero praticamente identico a quello che mi hai suggerito.
La cosa strana è che ho un altro metodo simile, ma senza parametro in ingresso, e quello riesco ad invocarlo tranquillamente. Tra l'altro, ho evitato di inserire l'attributo [FromUri] proprio perché vorrei che la api venisse invocata senza querystring.

Intanto ti ringrazio anche per il suggerimento sulla documentazione.
11.886 messaggi dal 09 febbraio 2002
Contributi
Non so, ho provato in locale e a me ha funzionato subito. Forse c'è qualcos'altro che interferisce o forse è normale che stia restituendo 404 se l'id 15 che stai fornendo non ha un record corrispondente nel database.

Se metti un breakpoint sul return Visual Studio interrompe l'esecuzione in quel punto o non ci passa per niente?

Enjoy learning and just keep making
33 messaggi dal 10 maggio 2015
Ho fatto la prova che mi hai indicato: al breakpoint non ci arriva proprio. Ho verificato sul DB e l'id del record è corretto.

Ipotizzo: è possibile che, per qualche motivo, vada in confusione perché c'è un controller MVC che ha lo stesso nome?
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,


è possibile che, per qualche motivo, vada in confusione perché c'è un controller MVC che ha lo stesso nome?

Penso di no perché WebAPI cerca degli ApiController e comunque il percorso /api/agenti/get-single/1 non può essere gestito dal modulo di routing di MVC dato che non è conforme alla route di default.

Hai provato a vedere se e come appare l'action nella documentazione di swagger?

ciao,
Moreno

Enjoy learning and just keep making
33 messaggi dal 10 maggio 2015
Ciao Moreno,
verifico e ti do riscontro.

Intanto, grazie mille per il supporto.

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.