Catch-tutto il percorso non riesce a trovare il percorso con Webapi2 Apicontroller
-
21-12-2019 - |
Domanda
Sto creando un servizio WebAPI2 e uno dei metodi che voglio implementare rappresenta un HTTP ottenere da un oggetto all'interno di una struttura dell'albero interno, quindi la richiesta sarebbe lungo le linee di:
GET /values/path/path/to/object/in/tree
.
Quindi vorrei che il mio metodo ricevere "percorso / per / oggetto / in / albero".
Tuttavia, ottengo un 404 quando corro questo, ed è interessante che ottengo un 404 che sia diverso dall'aspetto dello standard IIS 404. È intitolato "Errore server in" / 'applicazione. ", mentre quello per Una risorsa completamente non valida è intitolata 'HTTP Errore 404.0 - non trovato'.
Sto giocando con il modello predefinito per cercare di vedere se riesco a farlo funzionare, quindi la somiglianza.
Ho questo per il mio RouteConfig
public static void RegisterRoutes(RouteCollection routes)
{
var route = routes.MapRoute(
name: "CatchAllRoute",
url: "values/path/{*pathValue}",
defaults: new { controller = "Values", action = "GetPath" });
}
.
E questo è il mio ValuesController
:
[System.Web.Mvc.AuthorizeAttribute]
[RoutePrefix("values")]
public class ValuesController : ApiController
{
[Route("test/{value}")]
[HttpGet]
public string Test(string value)
{
return value;
}
[HttpGet]
public string GetPath(string pathValue)
{
return pathValue;
}
}
.
È interessante notare che se derivo da Controller
piuttosto che ApiController
funziona bene, ma quindi il normale instradamento dell'attributo non funziona.
Ho provato a seguire la metodologia in Questo post (http://www.tugberkugurlu.com/archive/asp-net-web-api-catch-all-route-parameter-binding) ma non riuscivo a farlo funzionare. Sono sicuro che mi manca qualcosa di stupidamente facile, ma avendo passato alcune ore su di esso ho pensato che prudente chiederò cosa sto facendo male.
Grazie
m
Soluzione
Il routing API Web non è uguale al routing MVC.invece di
route.MapRoute
.
Prova
public static void Register(HttpConfiguration config) {
config.MapHttpAttributeRoutes
config.Routes.MapHttpRoute(
name: "CatchAll", routeTemplate: "values/path/{*pathvalue}",
defaults: new {id = RouteParameter.Optional });
}
.
Il motivo per cui funziona dal controller è che Maproute è il formato corretto per il routing di un controller MVC, mentre MaphttProute è progettato per i controller API.