Question

Je suis entrain de créer un WebApi2 service, et l'une des méthodes que je veux mettre en œuvre représente un HTTP GET à partir d'un objet à l'intérieur d'un arbre interne de la structure de sorte que la demande devrait être le long des lignes de:

GET /values/path/path/to/object/in/tree

Donc, je veux que ma méthode à recevoir le "chemin/vers/objet/en/de l'arbre".

Cependant, je viens d'obtenir une erreur 404 lorsque je l'exécute, et c'est intéressant, j'obtiens une erreur 404 qui est différent à la recherche à la norme IIS 404.Il est intitulé "Erreur de Serveur dans l'Application'/'.', alors que celui pour une ressource non valide est intitulé "Erreur HTTP 404.0 - Non Trouvé".

Je joue avec le modèle par défaut pour les essayer et voir si je peux obtenir que cela fonctionne, d'où la similitude.

J'ai pour ma RouteConfig

public static void RegisterRoutes(RouteCollection routes)
{
    var route = routes.MapRoute(
               name: "CatchAllRoute",
                url: "values/path/{*pathValue}",
                defaults: new { controller = "Values", action = "GetPath" });
}

Et c'est mon 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;
    }
}

Fait intéressant, si je tire de Controller plutôt que de ApiController il fonctionne OK, mais alors la normale attribut de routage ne fonctionne pas.

J'ai essayé de suivre la méthodologie de la ce post (http://www.tugberkugurlu.com/archive/asp-net-web-api-catch-all-route-parameter-binding) mais je ne pouvais pas le faire fonctionner.

Je suis sûr que je suis absent quelque chose de facile, mais après avoir passé quelques heures sur ce j'ai pensé qu'il serait prudent de demander ce que je fais mal.

Merci

M

Était-ce utile?

La solution

L'api Web de routage n'est pas le même que le routage MVC.au lieu de

route.MapRoute

essayez

public static void Register(HttpConfiguration config) {
    config.MapHttpAttributeRoutes

    config.Routes.MapHttpRoute(
        name: "CatchAll", routeTemplate: "values/path/{*pathvalue}", 
        defaults: new {id = RouteParameter.Optional });
}

La raison pour laquelle il travaille à partir de contrôleur est que MapRoute est le format correct pour l'acheminement d'un contrôleur MVC, tandis que MapHttpRoute est conçu pour les contrôleurs d'API.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top