1

我正在解決MVC 3 Web API中的路由問題。它似乎應該很簡單,但我沒有取得任何進展。MVC 3 Web API路由不工作

我的錯誤是:

<Error> 
    <Message>The request is invalid.</Message> 
     <MessageDetail> 
      The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'Boolean NewViolationsPublished(Int32)' in 'BPA.API.Controllers.CacheManagementController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter. 
     </MessageDetail> 
    </Error> 

我的RegisterRoutes是這樣的:

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

      routes.MapHttpRoute(
       name: "NukeAllItemsFromCache", 
       routeTemplate: "api/CacheManagement/NukeAllItemsFromCache"); 


      routes.MapHttpRoute(
       name: "ControllerAndAction", 
      routeTemplate: "api/{controller}/{action}" 
      ); 

      routes.MapHttpRoute(
       name: "ControllerAndActionAndId", 
       routeTemplate: "api/{controller}/{action}/{id}", 
        defaults: new { id = RouteParameter.Optional, action = "Get" }, 
       constraints: new { id = @"^\d+$" } // Only integers 
      ); 

      routes.MapHttpRoute(
       name: "ControllerAndId", 
       routeTemplate: "api/{controller}/{id}", 
        defaults: new { id = RouteParameter.Optional }, 
      constraints: new { id = @"^\d+$" } // Only integers 
      ); 
     } 

我的控制器(我拿出代碼爲了便於閱讀):

public class CacheManagementController : ApiController 
    { 
     public CacheManagementController()   

     [HttpGet] 
     public bool NewViolationsPublished(int id) 

     [HttpGet] 
     public bool IsCached(CachedItemLabels label, int clientId) 

     [HttpGet] 
     public void RemoveItemFromCache(int clientId, CachedItemLabels cacheLabel, string test) 

     [HttpGet] 
     public string NukeAllItemsFromCache()  
    } 

我嘗試撥打電話時出現錯誤:

http://localhost/api/CacheManagement/NukeAllItemsFromCache 

TIA

+0

您是否嘗試過你的路線移動到底部,第一加載默認值? – 2013-04-11 19:10:43

+0

我剛剛將NukeAllItemsFromCache路由移動到RegisterRoutes方法的底部,並得到相同的錯誤。 – 2013-04-11 19:14:12

+0

爲什麼你不使用{控制器}/{動作}的默認路線來擊中它? (對不起,只是試圖理解這裏的邏輯)你也使用clientId的RemoveItemFromCache與一些額外的參數,但你的路線狀態它是ID,你是否能夠擊中任何其他路線? – 2013-04-11 19:21:06

回答

5

你確定你在正確的位置定義你的路線嗎? Web API路由應使用System.Web.Http.GlobalConfiguration.Configuration.Routes.MapHttpRoute(通常位於App_Start中的WebApiConfig.cs文件中)進行配置,如http://www.asp.net/web-api/overview/extensibility/configuring-aspnet-web-api所示,它與vanilla MVC使用的路由配置不同。

我想你可能只是打了默認的Web API路由,這是API/{控制器}/{ID},ID可選。該動作由HTTP動詞確定,在本例中爲GET,並且所有方法均通過[HttpGet]匹配。

編輯:例如

的Global.asax

protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 

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

     GlobalModifiers.ApplyGlobalConfiguration(this, true); 
    } 

WebApiConfig.cs

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     config.Routes.MapHttpRoute(
      name: "action-specific", 
      routeTemplate: "api/{controller}/{action}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
    ); 
} 
+0

你可能會做某事。還有研究要做,但WebApiConfig.cs是MVC 3還是4?在我的Global.asax> Application_Start()我有RouteConfig.RegisterRoutes(RouteTable.Routes);這帶我到RouteConfig.cs(不是WebApiConfig)w /一些路由定義。 – 2013-04-11 19:50:00

+0

我不確定,因爲我只使用了MVC 4.我將使用來自正常工作的Web API網站的示例編輯答案。 – 2013-04-11 20:02:08

+0

這最終導致我找到解決方案。我正在更新Global.asax> RegisterRoutes方法中的路由,而不是RouteConfig.RegisterRoutes方法。因此,當我用asax方法更新路線時,沒有任何事情發生。 – 2013-04-11 20:05:28

0

我beleave你的問題是在這條航線:

routes.MapHttpRoute(
    name: "ControllerAndActionAndId", 
    routeTemplate: "api/{controller}/{action}/{id}", 
    defaults: new { id = RouteParameter.Optional, action = "Get" }, 
    constraints: new { id = @"^\d+$" } // Only integers 
); 

您指定id作爲可選參數,並在同一時間限制它實際上是一個非空的數量。如果/api/CacheManagement/NukeAllItemsFromCache是一個例外,那麼爲其添加其他路線,否則,如果可能的話,緩解約束條件,如@"^\d*$"

+0

但是,它上面的控制器和操作路徑指定了如果沒有經過的整數該怎麼辦? – 2013-04-11 19:24:25

+0

我刪除了兩條有'約束'條目並且錯誤更改爲''的行,'參數字典中包含對於方法'Boolean NewViolationsPublished(Int32)'的非空類型'System.Int32'的參數'id'的空項。 'xxx.Controllers.CacheManagementController'。可選參數必須是引用類型,可爲空類型,或者聲明爲可選參數。' – 2013-04-11 19:28:15

0

你對你的思念配置的路由的默認操作:

routes.MapHttpRoute(
      name: "NukeAllItemsFromCache", 
      routeTemplate: "api/CacheManagement/NukeAllItemsFromCache"); 

應該

routes.MapHttpRoute(
      name: "NukeAllItemsFromCache", 
      routeTemplate: "api/CacheManagement/NukeAllItemsFromCache", 
      defaults: new { action = "NukeAllItemsFromCache" } 
); 
0

你試圖把參數ID像可空:

[HttpGet] 
public bool NewViolationsPublished(int? id) 

[HttpGet] 
    public bool NewViolationsPublished(Nullable<Int32> id) 

也許這個作品...

0

仔細檢查你的控制器擴展ApiController而非控制器

public class CacheManagementController : ApiController 

而不是

public class CacheManagementController : Controller