读PUT请求体

时间:2011-06-16 09:15:51

标签: c# .net asp.net-mvc asp.net-mvc-3

我有一段时间试图弄清楚为什么同一行返回请求体作为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();
    ...

}

根据我在Put()中得到的((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 \ 0 \ 0 \ 0 \ 0 ......“。

2 个答案:

答案 0 :(得分:11)

我应该早先看到Request.InputStream.Position指向请求正文的末尾,所以

Request.InputStream.Position = 0;

解决了这个问题。

答案 1 :(得分:0)

这可能是因为浏览器没有广泛支持HTTP Put,如SO Post:Doing a HTTP PUT from a browser中所述。你最好坚持GET和POST以获得最广泛的兼容性。但是,我听说过可以使用原始HttpWebRequest来执行put的代码,例如Jason DeFontes在此帖中的outlined here

        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);