Attribut de routage et à l'héritage

Je joue avec l'idée d'avoir un contrôleur de base qui utilise un référentiel générique de fournir les méthodes CRUD de base pour mon API contrôleurs de sorte que je n'ai pas à dupliquer le même code de base dans chaque nouveau contrôleur. Mais je suis en cours d'exécution dans des problèmes avec le service de routage attribut être reconnu quand il est dans la base de contrôleur. Pour montrer exactement ce que le problème que je vais avoir, j'ai créé une, très simple, WebAPI contrôleur.

Quand j'ai un Get méthode dans le Contrôleur principal et il hérite de la ApiController directement je n'ai pas de problèmes et cela fonctionne comme prévu.

[RoutePrefix("admin/test")]
public class TestController : ApiController
{
    [Route("{id:int:min(1)}")]
    public string Get(int id)
    {
        return "Success";
    }
}

Quand je bouge la Get méthode dans un contrôleur de base c'est de retourner le contenu de la page 404.

[RoutePrefix("admin/test")]
public class TestController : TestBaseController
{

}

public class TestBaseController : ApiController
{
    [Route("{id:int:min(1)}")]
    public string Get(int id)
    {
        return "Success";
    }
}

Certaines plus intéressantes notes:

  • Je peux accéder à l'action à GET /Test/1. Donc, c'est de trouver qu'il est fondé sur la route par défaut toujours.

  • Lorsque j'essaie d'accéder à POST /admin/test, il retourne du JSON

    {
    "Message":"Pas de HTTP ressource a été trouvée, qui correspond à l'URI de la demande"http://test.com/admin/test'.",
    "MessageDetail":"Aucun type a été trouvé qui correspond le contrôleur nommé 'admin'."
    }

Personne ne sait de façon à obtenir le routage de travailler avec des attributs à partir d'un contrôleur de base?

  • Je suis en train d'accomplir exactement la même chose - l'utilisation d'une api de base de contrôleur pour gérer CRUD - je suis surpris qu'il n'est pas plus commun. C'est la première fois que j'ai vu mention de quelqu'un d'autre d'essayer, et je suis maintenant coincé à l'acheminement de l'héritage de problème. Pourriez-vous partager ce que vous êtes en train de faire?
  • J'ai le contrôleur de base ont protégé les méthodes qui implémentent les opérations CRUD et puis, quand je créer un nouveau contrôleur, j'ai créer la méthode publique et de l'avoir appeler la méthode protégée. De cette façon, je peux mettre les itinéraires sur la méthode dans le contrôleur, et non pas dans le contrôleur de base, et ne pas avoir à dupliquer le code partout. Je n'ai pas l'amour, mais l'alternative était de ne pas utiliser de Route attributs et qui n'allait pas de travail dans ma situation, pour diverses raisons.
  • Merci pour la réponse. Je suis allé avec quelque chose de semblable, juste appel de base.[Get|Post|Put|Delete]() et passant à travers les paramètres. Ce n'est pas idéal, mais je suppose que l'avantage est qu'il est plus évident pour les gens qui ne connaissent pas le code où mettre personnalisé CRUD actions. Avez-vous trouvé d'autres ressources en ligne que de discuter de l'utilisation d'un contrôleur de base pour gérer les opérations CRUD? Ma recherche m'a donné aucun résultat.
  • Merci de voter pour la question, j'ai ouvert si vous souhaitez les ajouter à l'héritage de AttributeRouting - aspnetwebstack.codeplex.com/workitem/1688