2011-06-16 103 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