2015-01-21 55 views
1

我想創建一個基於Asp.Net MVC4 web api框架的REST api。 GET請求正常工作。所有其他動詞都被服務器忽略。 它只是說以下內容:MVC4 API後動詞拋出http 404

"No action was found on the controller 'Track' that matches the request." 

雖然示例錯誤是從軌道控制所有其他控制器有同樣的問題。

這是在控制器軌跡的方法,我試圖調用:

[HttpPost] 
    public Object Index(string token, string juke, string track) 
    { 
    } 

心中已經嘗試了使用像JSON對象,因此:

{ "track": "0000", "juke": "0000" } 

我試圖用「正常」的方式:

track=0000&juke=0000 

上面的例子'0000'是真正的id的替身。

可以肯定的,我也張貼Register()WebApiConfig.cs

public static void Register(HttpConfiguration config) 
    { 
     config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html")); 
     config.Routes.MapHttpRoute(
      name: "DefaultIndexBackEnd", 
      routeTemplate: "back-end/{controller}/{token}", 
      defaults: new { action = "Index", token = RouteParameter.Optional } 
     ); 
     config.Routes.MapHttpRoute(
      name: "DefaultBackEnd", 
      routeTemplate: "back-end/{controller}/{action}/{token}", 
      defaults: new { token = RouteParameter.Optional } 
     ); 
    } 
+0

你正在使用什麼請求url? – 2015-01-21 11:29:23

+0

我正在使用:「/ back-end/Track/0000」。再次,「0000」是真正代幣的替身。 – Feanaro 2015-01-21 11:31:50

+0

請提供您的查看頁面代碼。 – Aravindan 2015-01-21 11:32:27

回答

1

經過幾個小時的嘗試和研究文章,我終於找到了an article,這恰恰說明了我的問題!如果您遇到同樣的問題,請查看文章。

問題是我不得不在動作的一個參數上使用[FromBody]屬性。在將juketrack移動到模型中後,它終於如我所願地工作了。

感謝大家的幫助,你們都讓我走上正軌!

1

試試這個在您的TrackController。由於您使用多個參數,因此必須將其聲明爲可選。

[HttpPost] 
public Object Index(string token="", string juke="", string track="") 
{ 
} 

可以進行參數token強制性的,因爲token被聲明爲可選路由配置DefaultIndexBackEnd。我認爲當POST動作有多個參數時,使用[FromBody]屬性是個好主意。

1

首先,瞭解一個典型的REST Web API應該如何工作是很重要的。通常,它針對特定操作使用不同的HTTP動詞(GET,POST,PUT,DELETE)。

  • GET:從服務器獲取一個實體(或集合)
  • POST:創建一個新的實體
  • PUT:更新現有的實體
  • 刪除:刪除現有實體

因此,當我在您的Index操作上看到[HttpPost]時,我認爲REST API模式已損壞。

相反,在您的控制器中,您應該有一個Entity Get(int id)操作(獲取數據)和一個void Post(Entity entity)操作來創建新記錄。

不需要用HttpGetHttpPost來修飾你的動作,MVC Api框架會根據它們的名字將請求路由到你的動作。

你可以看一個例子here

+0

瞥見路由調試我知道,這是做什麼,它創建一個軌道,軌道參數是一個ID用於創建一個ID從另一個外部源緩存副本並將其綁定到一個juke。我將嘗試'Post()'和'Get()'操作。 – Feanaro 2015-01-21 13:50:55

+0

我同意,OP發佈的代碼違反了REST。 – BenjaminPaul 2015-01-21 13:51:46