20 messaggi dal 25 novembre 2006
Ciao Marco,
approccio molto interessante.
Ho però un problema :
Usando il tuo esempio ho aggiunto un metodo alla V2 della classe ValuesController
public string Magic()
{
return "v2 magic";
}

Non riesca a richiamarla, ho provato senza attributi niente ed il resto funziona.
Se uso [HttpGet] o [HttpGet]+[Route("Magic")] o [HttpGet]+ [Route("api/v2/Values/Magic")]
oltre a non richiamare il metodo Magic la Get() ritorna "Multiple actions ..."

Hai qualche suggerimento ?

Grazie in anticipo.

PS : non ho modificato nient'altro dell'esempio scaricato.
Ciao, se hai l'errore "Multiple Actions" direi che la tua implementazione di IHttpControllerSelector o non funziona o non viene richiamata. Riesci a verificarne il comportamento in Debug?
20 messaggi dal 25 novembre 2006
Ciao,
come anticipavo ho scaricato l'esempio ed ho solo aggiunto il membro Magic() alla classe della versione 2.

In debug nella SelectController dopo la ricerca del controllo con la versione + alta fa la new di un HttpControllerDescriptor con dati congruenti ma proseguendo torna :
{
"Message": "An error has occurred.",
"ExceptionMessage": "Multiple actions were found that match the request: \r\nGet on type WebApplication3.Controllers.V2.ValuesController\r\nMagic on type WebApplication3.Controllers.V2.ValuesController",
"ExceptionType": "System.InvalidOperationException",
"StackTrace": " at System.Web.Http.Controllers.ApiControllerActionSelector.ActionSelectorCacheItem.SelectAction(HttpControllerContext controllerContext)\r\n at System.Web.Http.Controllers.ApiControllerActionSelector.SelectAction(HttpControllerContext controllerContext)\r\n at System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken)\r\n at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()"
}
27 messaggi dal 15 luglio 2003
Ciao Marco, ottimo articolo.
Io ho questo problema.
In una ns vecchia (ma utilizzata diffusamente) API utilizziamo questo routing:

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

e dovremmo fare una nuova versione. Vorremmo quindi modifcare il routing in:

routeTemplate: "api/{version}/{controller}/{action}/{id}"
mettendo le nuove API nella dir Controllers/V2

facendo in modo che però l'altro resti, in modo da non creare problemi.

Qualè l'approccio corretto? Io ho fatto così (e sembra funzionare...)

Ho messo MapRoute (in questa sequenza)

... routeTemplate: "api/{version}/{controller}/{action}/{id}"
... routeTemplate: "api/{controller}/{action}/{id}"

spostato le vecchia API da Controllers a Controllers/V1

nel VersionedControllerSelector ho aggiunto questo controllo (2 riga)

string versionValue = (string)request.GetRouteData().Values["version"];
if (string.IsNullOrWhiteSpace(versionValue)) versionValue = "v1";
int version = int.Parse(versionValue.Substring(1));

Che ne pensi? Grz
Modificato da g.arcangeli il 17 luglio 2019 14:10 -

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.