2014-03-24 22 views
0

我有這樣的動作:C#WebApi2行動沒有發現

[ActionName("Find")] 
    [HttpGet] 
    public override IHttpActionResult Find(string number) 
    { 
     //Get customer by number... 
    } 

這是路線:

 config.Routes.MapHttpRoute(
      name: "ApiByAction", 
      routeTemplate: "api/{controller}/{action}", 
      defaults: new { action = "Get" } 
     ); 

這是跟蹤:

System.Web.Http.Request;;;http://localhost:12345/api/Customers/Find?number=100 
System.Web.Http.Controllers;DefaultHttpControllerSelector;SelectController;Route='controller:Customer,action:Find' 
System.Web.Http.Controllers;DefaultHttpControllerSelector;SelectController;Customer 
System.Web.Http.Controllers;HttpControllerDescriptor;CreateController; 
System.Web.Http.Controllers;HttpControllerDescriptor;CreateController;CustomerController 
System.Web.Http.Controllers;CustomerController;ExecuteAsync; 
System.Web.Http.Action;ApiControllerActionSelector;SelectAction; 
System.Web.Http.Action;ApiControllerActionSelector;SelectAction; 
System.Web.Http.Controllers;CustomerController;ExecuteAsync; 
System.Net.Http.Formatting;DefaultContentNegotiator;Negotiate;Type='HttpError', 

然而,動作不找到。路線不正確?

+0

什麼是實際錯誤?從跟蹤看起來更像是你在格式化程序中失敗。它看起來像路由工作得很好。 –

+0

只是500錯誤。沒有異常拋出,因爲代碼沒有達到動作。第二行'System.Web.Http.Action; ApiControllerActionSelector; SelectAction;'不包含操作名稱,因此操作未被選中。如果操作被選中,則該行如下所示:'System.Web.Http.Action; ApiControllerActionSelector; SelectAction; SelectedAction Find()' –

回答

0

添加「number」的段並定義控制器和編號的默認值(將其設置爲可選)。那麼它應該工作。

例子:

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

希望這有助於。祝你有個美好的一天,

Alberto

+0

但是,url如下所示:http:// localhost:12345/api/Customers /查找?數= 100 –

0

問題解決了。我的控制器是從一個基本控制器繼承的,而且這個基礎控制器必須使用稱爲查找的虛擬方法,並且它們也具有相同的操作名稱屬性。

0

您可以使用Action註釋路徑頂部的數據。

但這不是建議,因爲與OOP封裝衝突。