web-dev-qa-db-fra.com

Le routage d'attributs MVC ne fonctionne pas

Je suis relativement nouveau dans le framework MVC mais j'ai un projet Web fonctionnel avec un contrôleur API qui utilise AttributeRouting (package NuGet) - cependant, je démarre un autre projet et il ne veut tout simplement pas suivre les routes que j'ai mises endroit.

Manette:

public class BlazrController : ApiController
{
    private readonly BlazrDBContext dbContext = null;
    private readonly IAuthProvider authProvider = null;

    public const String HEADER_APIKEY = "apikey";
    public const String HEADER_USERNAME = "username";

    private Boolean CheckSession()
    {
        IEnumerable<String> tmp = null;
        List<String> apiKey = null;
        List<String> userName = null;

        if (!Request.Headers.TryGetValues(HEADER_APIKEY, out tmp)) return false;
        apiKey = tmp.ToList();

        if (!Request.Headers.TryGetValues(HEADER_USERNAME, out tmp)) return false;
        userName = tmp.ToList();

        for (int i = 0; i < Math.Min(apiKey.Count(), userName.Count()); i++)
            if (!authProvider.IsValidKey(userName[i], apiKey[i])) return false;

        return true;
    }

    public BlazrController(BlazrDBContext db, IAuthProvider auth)
    {
        dbContext = db;
        authProvider = auth;
    }

    [GET("/api/q/users")]
    public IEnumerable<string> Get()
    {

        return new string[] { "value1", "value2" };
    }

    [GET("api/q/usersauth")]
    public string GetAuth()
    {
        if (!CheckSession()) return "You are not authorized";

        return "You are authorized";
    }
}

AttributeRoutingConfig.cs

public static class AttributeRoutingConfig
{
    public static void RegisterRoutes(RouteCollection routes) 
    {    
        // See http://github.com/mccalltd/AttributeRouting/wiki for more options.
        // To debug routes locally using the built in ASP.NET development server, go to /routes.axd

        routes.MapAttributeRoutes();
    }

    public static void Start() 
    {
        RegisterRoutes(RouteTable.Routes);
    }
}

Global.asax.cs:

// Remarque: pour obtenir des instructions sur l'activation du mode classique IIS6 ou IIS7, // visitez http://go.Microsoft.com/?LinkId=9394801

public class WebApiApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }
}

Lorsque j'essaie de naviguer vers/api/q/users - j'obtiens une erreur 404 introuvable. Si je change les itinéraires en "/ api/blazr/users" - j'obtiens une erreur sur plusieurs actions et je ne peux pas déterminer quelle action entreprendre.

Toute aide est appréciée - j'ai vraiment juste besoin d'un petit coup de pouce pour comprendre où est le problème, pas besoin de le résoudre complètement pour moi (j'ai besoin d'apprendre!)

Merci

[~ # ~] modifier [~ # ~]

routes.axd:

api/{controller}/{id}
{resource}.axd/{*pathInfo}          
{controller}/{action}/{id}
37
Teagan42

Non seulement vous devez avoir l'appel à routes.MapMvcAttributeRoutes() dans votre App_Start\RouteConfig.cs fichier, il doit apparaître avant définissant votre itinéraire par défaut! Je l'ajoute avant cela et après avoir ignoré {resource}.axd{*pathInfo}. Je viens de découvrir cela en essayant de faire fonctionner correctement le routage d'attributs avec mon site Web MVC 5.

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapMvcAttributeRoutes();

        routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Account", action = "Index", id = UrlParameter.Optional }
        );

    }
101
Derreck Dean

Dans votre App_Start/RoutesConfig.cs

assurez-vous d'appeler la ligne de code suivante:

  routes.MapMvcAttributeRoutes();
33
David McEleney

Dans le gestionnaire de packages nuGet, installez sur votre projet Package d'hébergement Web API Web

ajoutez cette classe au dossier app_start-> WebApiConfig.cs (si elle ne se ferme pas - créez):

  public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            config.MapHttpAttributeRoutes(); // pay attention to this method
//here you can map any mvc route
            //config.Routes.MapHttpRoute(
            //    name: "DefaultApi",
            //    routeTemplate: "api/{controller}/{id}",
            //    defaults: new { id = RouteParameter.Optional }
            //);
            config.EnableSystemDiagnosticsTracing();
        }
    }

après Essayez de changer votre configuration Global.asax en:

public class WebApiApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            GlobalConfiguration.Configure(WebApiConfig.Register);
        }
    }

P.S.

regardez cet article, très utile http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2 =

à votre santé

7
Boris Malaichik

Je suis venu ici à la recherche de réponses liées à RoutePrefix. Après quelques tests, j'ai trouvé que l'ajout d'un

[RoutePrefix("MyPrefix")]

sans utiliser un attribut Route ultérieur tel que

[Route("MyRoute")]

signifie que RoutePrefix a été ignoré. Le routedebugger de Haack est très utile pour déterminer cela: https://haacked.com/archive/2008/03/13/url-routing-debugger.aspx/

Ajoutez-le simplement via NuGet, ce qui ajoutera une ligne à vos paramètres d'application, puis tous vos itinéraires seront affichés en bas de votre page. Je le recommande vivement pour tout problème de routage.

Au final, ma version finale ressemble à:

[RoutePrefix("Asset/AssetType")] [Route("{action=index}/{id?}")]

3
gdbj

Assurez-vous que le package NuGet "API WebApp" est installé pour AttributeRouting.

2
4rchie

J'ai rencontré ce problème aujourd'hui, j'ai découvert que si je devais utiliser l'attribut Route sur une action, je dois également ajouter l'attribut RoutePrefix sur le contrôleur.

Contrôleur =>

    [RoutePrefix("api/search")]
    public class SearchController : ApiController

Action =>

    [HttpGet]
    [Route("suburbs")]
    public IEnumerable<Model.Suburb> Suburbs([FromUri]string query = "")
0
Hemant