2013-06-05 24 views
31

Jestem względnie nowy w strukturze MVC, ale mam działający Web Project z kontrolerem API, który wykorzystuje AttributeRouting (pakiet NuGet) - jednak zaczynam inny projekt i po prostu nie chcę podążać wytyczonymi przeze mnie trasami.MVC Attribute Routing nie działa

Kontroler:

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:

// UWAGA: Instrukcje dotyczące włączania trybu IIS6 lub IIS7 klasycznej, // odwiedź 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); 
    } 
} 

Podczas próby nawigowania do/api/q/users - pojawia się błąd 404 nie znaleziony. Jeśli zmienię trasy na "/ api/blazr/users" - pojawia się błąd dotyczący wielu akcji i nie jestem w stanie określić, którą akcję podjąć.

Każda pomoc jest mile widziana - Naprawdę wystarczy niewielki sugerować, aby dowiedzieć się, gdzie problem jest, nie trzeba go rozwiązać całkowicie dla mnie

Dzięki

EDIT (muszę się nauczyć!)

routes.axd:

api/{controller}/{id} 
{resource}.axd/{*pathInfo}   
{controller}/{action}/{id} 
+0

Podczas korzystania z debugera trasy „” z 'AttributeRouting' (powinien być dostępny w' ~/routes.axd') widzisz oczekiwane trasy z atrybutów, czyli '/ api/q/users'? –

+0

Nie, tylko api/{kontroler}/{id}, {zasób} .axd/{* pathInfo} i {kontroler}/{akcja}/{id}. Kiedy przerywam aplikację na MapAttributeRoutes() - kolekcja tras wraca z 0 trasami ... – Teagan42

+0

Mam trasy, które pojawią się w routes.axd przez implementację IControllera w moim kontrolerze - ale nadal nie jest to w porządku (zwraca puste strona) – Teagan42

Odpowiedz

2

Upewnić masz pakiet Nuget "WebApp API" zainstalowany na Attribut eRouting.

31

W swoim App_Start/RoutesConfig.cs

upewnij się wywołać następującą linię kodu:

routes.MapMvcAttributeRoutes(); 
+12

Dla innych ślepo kopiujących-wklejanie kodu jak ja, zobacz odpowiedź poniżej z @Derreck_Dean, zanim spróbujesz tego. Ta odpowiedź jest niepełna. – makhdumi

+1

fajny, dziękuję .... świetnie :) –

73

Nie tylko trzeba mieć połączenie do routes.MapMvcAttributeRoutes() w pliku App_Start\RouteConfig.cs, to musi pojawić się przed określając domyślną trasę! Dodaję to wcześniej i po zignorowaniu {resource}.axd{*pathInfo}. Właśnie odkryłem, że próbuję przekonać routing atrybutów do poprawnej pracy z moją stroną 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 } 
     ); 

    } 
+1

To zadziałało dla mnie .. dziękuję! Nie wiem, dlaczego manekiny z Microsoftu nie są w stanie udokumentować tej prostej rzeczy. – user275801

+1

To właśnie robiło różnicę! –

+1

pracował dla mnie +1 Dzięki –

6

W Nuget menedżera pakietów zainstalować do projektu pakietu Web API Web Host

dodać tę klasę do folderu app_start-> WebApiConfig.cs (jeśli nie ma wyjścia - tworzenie):

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(); 
     } 
    } 

po Spróbuj zmienić konfigurację global.asax do:

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

P.S.

patrzeć przez ten artykuł, bardzo przydatny http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2

okrzyki

1

Przyjechałem tu szuka odpowiedzi związanych RoutePrefix. Po kilku testów, okazało się, że proste dodanie

[RoutePrefix("MyPrefix")]

bez użycia kolejnego trasy atrybutów, takie jak

[Route("MyRoute")]

oznacza RoutePrefix był ignorowany. Wysyłany przez Haacka router jest bardzo pomocny w określeniu tego: https://haacked.com/archive/2008/03/13/url-routing-debugger.aspx/

Po prostu dodaj go przez NuGet, który doda linię do ustawień twojej aplikacji, a następnie wszystkie twoje trasy są wyświetlane u dołu strony. Gorąco polecam dla wszelkich problemów z routingiem.

W końcu moja ostateczna wersja wygląda następująco:

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