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