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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top