2013-06-05 109 views
31

我對MVC框架相對比較陌生,但我有一個運行Web項目的API控制器使用AttributeRouting(NuGet包) - 但是,我開始另一個項目,它只是沒有想要遵循我放置的路線。MVC屬性路由不工作

控制器:

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:

//注意:有關啓用IIS6或IIS7經典模式, 指令//訪問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); 
    } 
} 

當我嘗試導航到/ api/q/users時 - 我收到一個404找不到的錯誤。如果我將路由更改爲「/ api/blazr/users」 - 我收到有關多個操作的錯誤,無法確定要執行的操作。

任何幫助表示讚賞 - 我真的只需要一個小的微調,以找出其中的問題是,沒有必要完全解決這個問題對我來說

感謝

EDIT(我需要學習!)

routes.axd:

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

當您使用從'AttributeRouting'的「路線調試器」(應該可以在'〜/ routes.axd')你看來自屬性的預期路線,即'/ api/q/users'? –

+0

不,只是api/{controller}/{id},{resource} .axd/{* pathInfo}和{controller}/{action}/{id}。當我在MapAttributeRoutes()上打斷應用程序時 - 路由集合返回0路由... – Teagan42

+0

我在route.axd中通過在控制器中實現IController來顯示路由 - 但它仍不完全正確(返回空頁) – Teagan42

回答

2

確定您已經NuGet包 「Web應用程序API」 安裝Attribut eRouting。

31

在你App_Start/RoutesConfig.cs

確保您撥打下面的代碼行:

routes.MapMvcAttributeRoutes(); 
+12

對於其他人像我一樣盲目複製粘貼代碼,請在嘗試此操作之前,從@Derreck_Dean中查看以下答案。這個答案是不完整的。 – makhdumi

+1

不錯的,謝謝....很好:) –

73

你不僅要有呼叫routes.MapMvcAttributeRoutes()App_Start\RouteConfig.cs文件,它必須出現在之前定義您的默認路線!我在此之前和之後加上它,忽略{resource}.axd{*pathInfo}。剛剛發現試圖讓屬性路由與我的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

這對我有效..謝謝!不知道爲什麼微軟的傻瓜無法記錄這個簡單的事情。 – user275801

+1

這是什麼改變了! –

+1

爲我工作+1謝謝 –

6

在NuGet包管理器安裝到您的項目 的Web API的Web主機包

添加這個類到文件夾app_start-> WebApiConfig.cs(如果不退出 - 創建):

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

後嘗試改變你的Global.asax的配置是:

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

P.S.

期待通過這篇文章,是非常有用的 http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2

歡呼

1

我來到這裏尋找有關RoutePrefix答案。一些測試後,我發現,簡單地增加一個

[RoutePrefix("MyPrefix")]

而不使用後續路由屬性如

[Route("MyRoute")]

指RoutePrefix被忽略。 Haack的routedebugger在確定這一點時非常有幫助:https://haacked.com/archive/2008/03/13/url-routing-debugger.aspx/

只需通過NuGet添加它,它會在您的appsettings中添加一行,然後所有路由都會顯示在頁面的底部。強烈建議任何路由問題。

最後,我的最終版本是這樣的:

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