2014-06-30 46 views
1

從我的MVC應用程序的API,我試圖做一個POST請求,在API控制器命名這些樣本終點(行動)MembershipController一個簡單的POST請求的Web API不打在所有

[HttpPost] 
public string GetFoo([FromBody]string foo) 
{ 
    return string.Concat("This is foo: ", foo); 
} 

[HttpPost] 
public string GetBar([FromBody]int bar) 
{ 
    return string.Concat("This is bar: ", bar.ToString()); 
} 

[HttpPost] 
public IUser CreateNew([FromBody]NewUserAccountInfo newUserAccountInfo) 
{ 
    return new User(); 
} 

這裏的客戶端代碼:

var num = new WebAPIClient().PostAsXmlAsync<int, string>("api/membership/GetBar", 4).Result; 

下面是我的WebAPIClient類的代碼:

public class WebAPIClient 
{ 
    private string _baseUri = null; 

    public WebAPIClient() 
    { 
     // TO DO: Make this configurable 
     _baseUri = "http://localhost:54488/"; 
    } 

    public async Task<R> PostAsXmlAsync<T, R>(string uri, T value) 
    { 
     using (var client = new HttpClient()) 
     { 
      client.BaseAddress = new Uri(_baseUri); 

      client.DefaultRequestHeaders.Accept.Clear(); 
      client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml")); 

      var requestUri = new Uri(client.BaseAddress, uri); 

      var response = await client.PostAsXmlAsync<T>(requestUri, value); 

      response.EnsureSuccessStatusCode(); 

      var taskOfR = await response.Content.ReadAsAsync<R>(); 

      return taskOfR; 
     } 
    } 
} 

我已經爲Web API定義了以下默認路由:

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

UPDATE 我的代碼中斷到調試,直到時間的System.Net.HttpClient代碼PostAsXmlAsync方法被調用。但是,沒有請求出現在提琴手。但是,如果我嘗試在Fiddler中編寫POST請求或試圖通過瀏覽器觸發GET請求到其中一個API端點,則通過Fiddler組成的POST請求會告訴我,我不會發送任何數據我必須。發送GET請求的瀏覽器正確告訴我該操作不支持GET請求。

這似乎是System.Net.HttpClient類沒有正確發送POST請求。

+0

你可以顯示你的POST請求不工作嗎? – djikay

+0

默認情況下,Fiddler不會捕獲localhost通信,你必須做一些事情來捕獲這個通信:http: //docs.telerik.com/fiddler/Configure-Fiddler/Tasks/MonitorLocalTraffic – JotaBe

+0

You ca n使用Postman,DHC或Advanced REST客戶端等擴展程序來測試您的Web API。嘗試其中的任何一種,它們都非常有幫助,並且使用Fiddler提出請求更容易一些。 (我更喜歡Postman:https://chrome.google.com/webstore/detail/postman-rest-client/fdmmgilgnpjigdojojpjoooidkmcomcm?hl=en)。 – JotaBe

回答

0

最常見的問題之一是您不使用適當的屬性。

考慮到存在具有相同名稱ASP.NET MVC和ASP.NET Web API的屬性,但生活在不同的命名空間:

這是一個非常非常平常的錯誤,並影響到allkind的存在兩種MVC和Web API的事情。因此,在使用bith世界中存在的某些東西時(例如過濾器,屬性或依賴注入註冊),您必須非常小心。

+0

謝謝。這是非常有用的建議。我剛剛檢查過,屬性都來自正確的位置,即來自Web API中的'System.Web.Http'命名空間。 –

0

我遇到過類似的問題(雖然可能不一樣)。在我的情況下,我沒有給輸入元素賦予name屬性。我只是想通了這一點,當小提琴手沒有表現出後的數據被髮送到服務器(就像你的情況下)

<input id="test" name="xyz" type="text" /> 

添加在固定我的問題input標籤的name屬性。

但是,還有一件事要注意。 WebAPI不直接將表單數據放入參數中。您必須創建一個具有這些屬性的對象,並將該對象放置在後控制器的參數中。或者,您可以像這樣放置任何參數:

[Route("name/add")] 

    public async Task Post() 
    { 
     if (!Request.Content.IsMimeMultipartContent()) 
     { 
      return; 
     } 

     var provider = PostHelper.GetMultipartProvider(); 
     var result = await Request.Content.ReadAsMultipartAsync(provider); 
     var clientId = result.FormData["xyz"]; 
     ... 
0

嘗試將FromBody更改爲FromUri。

如果參數是「簡單」類型,Web API將嘗試從URI獲取值。簡單類型包括.NET原始類型(int,bool,double等),加上TimeSpan,DateTime,Guid,decimal和string,以及任何類型的轉換器都可以從字符串轉換。

對於複雜類型,Web API嘗試使用媒體類型格式化程序從消息正文讀取值。

0

刪除FromBody都在傳遞參數(它可以在這個時候無論是在URI傳遞,查詢字符串或表單提交(這有點兒類似於查詢字符串)不作任何限制

[HttpPost] 
public string GetFoo(string foo){...} 

它將被隱式解析並通過