2013-06-05 33 views
31

Tôi tương đối mới với khung MVC nhưng tôi có một dự án Web hoạt động với bộ điều khiển API sử dụng AttributeRouting (gói NuGet) - tuy nhiên, tôi bắt đầu một dự án khác và nó không muốn theo dõi các tuyến đường mà tôi đưa ra.Định tuyến thuộc tính MVC không hoạt động

Bộ điều khiển:

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:

// Lưu ý: Để được hướng dẫn về cách kích hoạt IIS6 hoặc chế độ IIS7 cổ điển, // truy cập 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); 
    } 
} 

Khi tôi cố điều hướng đến/api/q/users - tôi gặp lỗi 404 không tìm thấy. Nếu tôi thay đổi các tuyến đường thành "/ api/blazr/users" - tôi gặp lỗi về nhiều hành động và không thể xác định hành động cần thực hiện.

Any help is appreciated - Tôi thực sự chỉ cần một lực đẩy nhỏ để tìm ra nơi vấn đề là, không cần phải giải quyết nó hoàn toàn đối với tôi

Cảm ơn

EDIT (Tôi cần phải học!)

routes.axd:

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

Khi bạn sử dụng 'debugger đường' từ 'AttributeRouting' (nên có sẵn tại' ~/routes.axd') làm bạn thấy các tuyến đường dự kiến ​​từ các thuộc tính, tức là '/ api/q/users'? –

+0

Không, chỉ cần api/{controller}/{id}, {tài nguyên} .axd/{* pathInfo} và {controller}/{action}/{id}. Khi tôi phá vỡ các ứng dụng trên MapAttributeRoutes() - bộ sưu tập tuyến đường trở lại với 0 tuyến đường ... – Teagan42

+0

Tôi có các tuyến đường để hiển thị trong routes.axd bằng cách thực hiện IController trong bộ điều khiển của tôi - nhưng nó vẫn không hoàn toàn đúng (trả về sản phẩm nào trang) – Teagan42

Trả lời

2

Đảm bảo bạn đã NuGet gói "WebApp API" cài đặt cho attribut eRouting.

31

Trong App_Start bạn/RoutesConfig.cs

chắc chắn rằng bạn gọi dòng mã sau đây:

routes.MapMvcAttributeRoutes(); 
+12

Đối với những người khác sao chép mã mờ một cách mù quáng như tôi, hãy xem câu trả lời dưới đây từ @Derreck_Dean trước khi bạn thử điều này. Câu trả lời này chưa hoàn thành. – makhdumi

+1

đẹp, cảm ơn .... tuyệt vời :) –

73

Không chỉ làm bạn phải có cuộc gọi đến routes.MapMvcAttributeRoutes() trong tập tin App_Start\RouteConfig.cs của bạn, nó phải xuất hiện trước khi xác định tuyến đường mặc định của bạn! Tôi thêm nó trước đó và sau khi bỏ qua {resource}.axd{*pathInfo}. Chỉ cần tìm ra rằng cố gắng để có được định tuyến thuộc tính để làm việc một cách chính xác với trang web MVC 5 của tôi.

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

Điều này làm việc cho tôi .. cảm ơn bạn! Không chắc tại sao các núm vú giả ở microsoft không thể ghi lại điều đơn giản này. – user275801

+1

Đây là những gì tạo nên sự khác biệt! –

+1

đã hoạt động đối với tôi +1 Cảm ơn –

6

Trong quản lý gói NuGet cài đặt vào dự án của bạn Host Web API Web gói

thêm lớp này vào thư mục app_start-> WebApiConfig.cs (nếu nó không thoát - tạo):

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

sau Hãy thử thay đổi cấu hình Global.asax của bạn để:

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

P.S.

xem xét thông qua bài viết này, rất hữu ích http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2

cổ vũ

1

Tôi đến đây tìm kiếm câu trả lời liên quan đến RoutePrefix. Sau một số thử nghiệm, tôi thấy rằng chỉ đơn giản là thêm một

[RoutePrefix("MyPrefix")]

mà không sử dụng một Route tiếp theo thuộc tính như

[Route("MyRoute")]

nghĩa là RoutePrefix đã bị bỏ qua. Máy định tuyến của Haack rất hữu ích trong việc xác định điều này: https://haacked.com/archive/2008/03/13/url-routing-debugger.aspx/

Chỉ cần thêm nó qua NuGet, sẽ thêm dòng vào các ứng dụng của bạn, và sau đó tất cả các tuyến đường của bạn được hiển thị ở cuối trang của bạn. Rất khuyên bạn nên cho bất kỳ vấn đề định tuyến.

Cuối cùng, phiên bản cuối cùng của tôi trông giống như:

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

Các vấn đề liên quan