2013-01-14 83 views
2

我在寫一個簡單的web api應用程序。當我需要在我的web api控制器中使用兩種POST方法時,我進入了一個階段。其中一種方法起作用,另一種則不起作用。我的路由表看起來是這樣的:Web API - 多種POST方法

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

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

然後,我有我的方法是這樣定義的:

[HttpPost] 
    public bool PostTaskAgain(My3TasksWebAPI.Data.Task task) 
    { 
     var oldTask = _db.Task.Where(t => t.Id == task.Id).SingleOrDefault(); 

     oldTask.DoAgain = true; 
     oldTask.DateUpdated = task.DateUpdated; 

     if (_db.SetOfTasks.Where(t => CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(t.DateCreated, CalendarWeekRule.FirstFullWeek, DayOfWeek.Monday) == CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(DateTime.Now, CalendarWeekRule.FirstFullWeek, DayOfWeek.Monday)).Any()) 
     { 
      int currentSetOfTasksId = _db.SetOfTasks.OrderBy(s => s.DateCreated).FirstOrDefault().Id; 

      My3TasksWebAPI.Data.Task newTask = new Data.Task() { CreatedBy = oldTask.CreatedBy, DateCreated = oldTask.DateCreated, DateUpdated = null, DoAgain = false, Notes = string.Empty, SetOfTasksId = currentSetOfTasksId, Status = false, Title = oldTask.Title, UserId = oldTask.UserId }; 

      _db.Task.Add(newTask); 
     } 

     _db.SaveChanges(); 

     return true; 
    } 

    // Post api/values/PostSetOfTasks/{setOfTasks} 
    [HttpPost] 
    public bool PostSetOfTasks(My3TasksWebAPI.Data.SetOfTasks setOfTasks) 
    { 
     _db.SetOfTasks.Add(setOfTasks); 

     _db.SaveChanges(); 

     return true; 
    } 

當我打電話PostTaskAgain我得到一個內部服務器錯誤。我認爲它可能是路由表,但我不知道如何處理兩個post方法。 我調用web API從我的asp.net MVC應用程序是這樣的:

HttpResponseMessage response = client.PostAsJsonAsync("api/values/PostSetOfTasks", model.SetOfTasks).Result; 

HttpResponseMessage response = client.PostAsJsonAsync("api/values/PostTaskAgain", taskToPost).Result; 

這意味着,包括我的行動。

+1

這兩種方法可以合併爲一種。需要多件商品的商品仍然可以單件商品。 –

+0

您是否在使用提琴手來確定實際上發佈的內容? –

+0

附加到該異常的錯誤消息是什麼? –

回答

0

我的LINQ查詢出現問題。

The response from the server was: {"$id":"1","Message":"An error has occurred.","ExceptionMessage":"LINQ to Entities does not recognize the method 'Int32 GetWeekOfYear(System.DateTime, System.Globalization.CalendarWeekRule, System.DayOfWeek)' method, and this method cannot be translated into a store expression.","ExceptionType":"System.NotSupportedException","StackTrace":" at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.DefaultTransl‌​ator.Translate(ExpressionConverter parent, MethodCall.... 

糾正linq查詢後,一切工作正常。 Visual Studio對我做的linq查詢錯了。

3

在webapi中使用POST可能會非常棘手,但您的問題變得微不足道。但是,對於那些可能偶然發現此頁面的人:

我將專門討論POST,因爲處理GET很簡單。我不認爲很多人會用webapis來解決GET問題。無論如何..

如果您的問題是 - 在MVC Web Api中,如何使用自定義操作方法名稱而不是通用HTTP動詞? - 執行多個帖子? - 發佈多種簡單類型? - 通過jQuery發佈複雜類型?

那麼以下解決方案可以幫助:

首先,要使用的Web API 定製操作方法,添加Web API路線爲:

public static void Register(HttpConfiguration config) 
{ 
      config.Routes.MapHttpRoute(
       name: "ActionApi", 
       routeTemplate: "api/{controller}/{action}"); 
} 

他們可以創建行動的方法,如:現在

[HttpPost] 
     public string TestMethod([FromBody]string value) 
     { 
      return "Hello from http post web api controller: " + value; 
     } 

,從您的瀏覽器控制檯火以下的jQuery

$.ajax({ 
      type: 'POST', 
      url: 'http://localhost:33649/api/TestApi/TestMethod', 
      data: {'':'hello'}, 
      contentType: 'application/x-www-form-urlencoded', 
      dataType: 'json', 
success: function(data){ console.log(data) } 
     }); 

二,要執行多個帖子, 很簡單,創建多個操作方法並用[HttpPost] attrib進行裝飾。 使用[ActionName(「MyAction」)指定自定義名稱等 會來jQuery的第四點以下

第三,所有的 首先,在單個動作發佈多個簡單的類型是不可能的並且有一種特殊的格式來發布單個簡單類型(除了在查詢字符串或REST樣式中傳遞參數外)。 這就是讓我用Rest Clients敲打我的腦袋,並在網絡上狩獵近5個小時,最終,下面的網址幫助了我。仍然會引用該鏈接的內容可能會失效!

Content-Type: application/x-www-form-urlencoded 
in the request header and add a = before the JSON statement: 
={"Name":"Turbo Tina","Email":"[email protected]"} 

http://forums.asp.net/t/1883467.aspx?The+received+value+is+null+when+I+try+to+Post+to+my+Web+Api

無論如何,讓我們度過這個故事。繼續前進:

四,通過張貼jQuery的複雜類型着,當然,$。阿賈克斯()是要及時上門中的作用:

讓我們說,行動方法接受了一個id一個Person對象和一個名字。所以,從JavaScript:

var person = { PersonId:1, Name:"James" } 
$.ajax({ 
      type: 'POST', 
      url: 'http://mydomain/api/TestApi/TestMethod', 
      data: JSON.stringify(person), 
      contentType: 'application/json; charset=utf-8', 
      dataType: 'json', 
      success: function(data){ console.log(data) } 
     }); 

和動作的樣子:

[HttpPost] 
     public string TestMethod(Person person) 
     { 
      return "Hello from http post web api controller: " + person.Name; 
     } 

上述所有,爲我工作! 乾杯!

+0

Hello ,謝謝你的回答呃但我的代碼工作正常。問題出在LINQ查詢中,而不是在Web API代碼中。 –