2014-04-11 21 views
1

我有這樣的路由設置在我WebApiConfigAPI路由404如果可選參數錯過

public static void Register(HttpConfiguration config) 
    { 
     config.MapHttpAttributeRoutes(); 

     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{action}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 

     config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html")); 

     GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; 
    } 

這些方法裏面/Api/ProductController.cs

public object GetProduct(int id) 
    { 
     var productRepo = new ProductRepository(db); 
     var product = productRepo.GetItem(id); 
     return product.ToAnonymousType(); 
    } 

    public object GetTest() 
    { 
     var productRepo = new ProductRepository(this.db); 
     var product = productRepo.GetItem(10000); 
     return product.ToAnonymousType(); 
    } 

我可以請求/ API /產品/ getproduct/10000並返回JSON。

如果我請求/ API /產品/ gettest我收到了404

如果我gettest改變

public object GetTest(int id) 

和請求/ API /產品/ gettest/10000我得到JSON。

我不知道爲什麼404會發生。我有其他控制器(對於非API請求)正常處理請求。經過幾年的webforms,我是MVC的新手,這讓我很難過。作爲參考,這是我RouteConfig

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

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

和我的Application_Start

protected void Application_Start() 
    { 
     BundleConfig.RegisterBundles(BundleTable.Bundles); 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 
     GlobalConfiguration.Configure(WebApiConfig.Register); 
    } 

回答

2

這是因爲你的路由的排序。

RouteConfig.RegisterRoutes(RouteTable.Routes); 

之前

GlobalConfiguration.Configure(WebApiConfig.Register); 

叫和你的RegisterRoutes方法包含一個默認值(和非常通用的)路線

url: "{controller}/{action}/{id}" 

這個通用(默認)規則將匹配的

您的網址模式
api/product/gettest 

之前,您的WebAPI路線將有機會匹配它。

您可以擺脫超級通用路由的,如果沒有必要(和使用更具體的路線),或簡單地將呼叫轉移到

GlobalConfiguration.Configure(WebApiConfig.Register); 

調用之前來

RouteConfig.RegisterRoutes(RouteTable.Routes); 

在您的Global.asax中。

我建立了一個樣本,包含所有你提供的信息,並且移動該調用工作得很好。 我希望這可以幫助。

+0

是的,就這樣做了!真的很明顯。謝謝! – Craig

+0

沒問題!樂意效勞。 –