2011-06-16 185 views
4

我有一段時間試圖弄清楚爲什麼同一行返回的請求體爲Post()中的字符串和Put()中的空字符串,最終如何獲取請求正文放()。閱讀PUT請求正文

[HttpPost] 
public JsonResult Post() 
{ 
    ... 
    var todoJson = new StreamReader(Request.InputStream).ReadToEnd(); 
    ... 
} 

[HttpPut] 
public JsonResult Put(int id) 
{ 
    ... 
    var todoJson = new StreamReader(Request.InputStream).ReadToEnd(); 
    ... 

} 

基於((System.Web.HttpInputStream)(Request.InputStream))._data._data我得到了認沽(),字節值是在請求體中,但我無法提取內容。 任何幫助非常感謝。

編輯:從HttpRequest.InputStream文檔工作在Post()中,在Put()中它返回一個字符串「\ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 ...」內容長度的。

回答

10

我應該已經看到了這個早期Request.InputStream.Position指向請求結束身體,所以

Request.InputStream.Position = 0; 

修復了這個問題。

0

這可能是因爲HTTP PUT是沒有得到廣泛支持的瀏覽器,如SO帖子中提到:Doing a HTTP PUT from a browser。您可能最好堅持GET和POST以獲得最廣泛的兼容性。不過,我已經在這個崗位聽說的代碼,可以使用原始HttpWebRequest執行認沽,如outlined here由Jason DeFontes:

 string json = "..."; 
     byte[] arr = System.Text.Encoding.UTF8.GetBytes(xml); 
     HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://localhost/"); 
     request.Method = "PUT"; 
     request.ContentType = "application/json"; 
     request.ContentLength = arr.Length; 
     Stream dataStream = request.GetRequestStream(); 
     dataStream.Write(arr, 0, arr.Length); 
     dataStream.Close(); 
     HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
     string returnString = response.StatusCode.ToString(); 
     Console.WriteLine(returnString); 
+0

謝謝,這是很好的閱讀。我看到這個代碼和事情是瀏覽器發送PUT。爲了更清楚我基本上爲backbone.js [todo](http://documentcloud.github.com/backbone/examples/todos/index.html)應用程序做了一個RESTful處理程序,所以所有的GET,POST, PUT,DELETE請求由主幹發送,併爲爲Google App Engine編寫的[相同應用](https://github.com/ccarpenterg/todolist/wiki)工作。所以它出現在請求體是存在的,我不能讀它。 – 2011-06-16 10:25:49