2013-02-28 35 views
5

我有下面的代碼,但請求端(富()/酒吧())總是在No action was found on the controller 'Device' that matches the request.ASP.NET的WebAPI - 沒有行動被發現

我在WebApiConfig已經定製路線:

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

我的ASP.NET的WebAPI控制器:

[HttpPost] 
public void UpdateToken(string newToken) 
{ 
    _deviceHandler.UpdateToken(newToken); 
} 

要查詢我的ASP.NET的WebAPI我使用RestSharp。

private static void Send(string resource, Method method, object payload) 
{ 
    var client = new RestClient(baseUrl); 
    var request = new RestRequest(resource, method); 
    request.XmlSerializer = new JsonSerializer(); 
    request.RequestFormat = DataFormat.Json; 
    request.AddBody(payload); 

    var response = client.Execute(request); 
    // ... handling response (exceptions, errors, ...) 
} 

public void Foo() 
{ 
    var newToken = "1234567890"; 
    Send("/api/device/updatetoken", RestSharp.Method.POST, newToken); 
} 

public void Bar() 
{ 
    var newToken = new { newToken = "1234567890" }; 
    Send("/api/device/updatetoken", RestSharp.Method.POST, newToken); 
} 

避免這種錯誤的唯一方法是用一個屬性創建一個包裝類(獲取;集;),它具有控制參數(newToken)的名稱。

我有很多請求發送一個或兩個自定義字符串(未定義的長度)作爲後(get的長度有限)。但是爲每個場景創建一個包裝器實現是真正的開銷!我正在尋找另一條路。

PS:我希望我沒有通過簡化方案所做的任何錯誤=)

回答

12

原語默認情況下,從URI約束。如果你想有一個基本來自於身體,你應該使用[FromBody]屬性是這樣的:

[HttpPost] 
public void UpdateToken([FromBody] string newToken) 
{ 
    _deviceHandler.UpdateToken(newToken); 
} 

的字符串將隨後使用適當的格式進行反序列化。如果是JSON,請求主體應該看起來像這樣:

"1234567890" 
+0

謝謝,只是缺少[FromBody] - 屬性是錯誤。 – dannyyy 2013-02-28 14:24:54

+0

這只是拯救了我的夜晚。我在b my我的腦袋,想知道爲什麼這一條特定的路線變成了404.這需要一個int,其餘的路線都採用參考類型。添加[FromBody]屬性的竅門。 – squillman 2015-04-12 06:09:59

+0

1爲了挽救我半天的生命,一半已經浪費在這裏謝謝 – 2016-07-09 08:02:08

相關問題