2013-06-11 106 views
12

我不能爲我的生活弄清楚這一點。我有一個帶有Get和Post方法的web api控制器。 Get方法在使用和不使用參數的情況下都可以正常工作,但是當我嘗試向其中添加String參數時,發佈會中斷。以下是我的代碼。ASP.NET WebApi Post Method - 404當傳遞參數

路線:

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

控制器:

public class AuditController : ApiController 
{ 
    public String Post(String test) 
    { 
     return "Success : " + test; 
    } 

    public String Get(String test) 
    { 
     return "Success : " + test; 
    } 
} 

請求:

var request = WebRequest.Create("http://localhost:42652/Audit"); 
     request.Method = "POST"; 
     request.ContentType = "application/x-www-form-urlencoded"; 
     using (var writer = new StreamWriter(request.GetRequestStream())) 
     { 
      writer.Write("test=TEST"); 
     } 
     WebResponse webResponse = request.GetResponse(); 

我試過的要求很多變化,我覺得有一些簡單的我失蹤。謝謝你的幫助。

+1

你的路線說它有一個名爲'id'的參數,但是在你的方法中你傳遞了一個名爲'test'的參數。它會是什麼?原始類型參數總是試圖從Uri讀取,所以你的post方法將不起作用。我真的建議你通過asp.net主頁上所有非常好的ASP.Net Web API教程! – JustAnotherUserYouMayKnow

+0

這是^^準確嗎? – Jonesopolis

+0

是的。您的Get方法表示沒有{id}參數的路由 - 因爲您的id參數在方法中不存在。當您調用「Audit?test = value」,而不是「Audit/value」時,您的測試參數是可選查詢參數之一。你接受的答案總結得不錯,但我仍然鼓勵你真的通過教程! – JustAnotherUserYouMayKnow

回答

21

既然您期待參數test來自請求正文,您需要用FromBody屬性來修飾它。例如:([FromBody]String test)。對於其他複雜類型,這不適用,例如:Employee這個類隱含地認爲是來自Body。

拒絕GET請求。它應該只與查詢字符串/Audit?test=Mike

測試即將繼博客文章被工作大約有參數的詳細信息綁定: http://blogs.msdn.com/b/jmstall/archive/2012/04/16/how-webapi-does-parameter-binding.aspx

另外,我看到你正在使用的WebRequest。你有沒有考慮使用System.Net.Http中的HttpClient呢?

+0

我添加了FromBody屬性,它現在會到達服務,但post方法中的'test'變量不幸的是null。我也會看看HttpClient。 – Jonesopolis

+0

嘗試在你的身體中發送「= TEST」。 –

+0

奇妙的是,它做到了!感謝您的見解 – Jonesopolis