第一种:直接获取输入流
Stream stream = Request.InputStream;
string json = string.Empty;
if (stream.Length > 0)
{
StreamReader sr = new StreamReader(stream);
json = sr.ReadToEnd();
}
第二种:
var json = string.Empty;
var EncodingName = Context.Request.ContentEncoding.HeaderName;
System.IO.Stream sm = Context.Request.InputStream;
if (sm != null)
{
sm.Seek(0, SeekOrigin.Begin);
int len = (int)sm.Length;
byte[] inputbyte = new byte[len];
sm.Read(inputbyte, 0, len);
sm.Close();
json = System.Text.Encoding.GetEncoding(EncodingName).GetString(inputbyte);
}
解析:
第一种 是直接获取Stream数据进行读取
第二种:设置当前流中的位置
我们一般时候使用第一种方法即可,毕竟不管读取文件还是获取请求的流 都是第一次读取此刻流的起始位置为0。
但是针对于MVC来说,数据流在action时候,框架内部机制已经获取到流的数据或者流已经close掉了。
我们此时在使用第一种方法是读取不到流的数据的。所以我们需要从新设置当前流的起始位置进行读取
即:sm.Seek(0, SeekOrigin.Begin);
简单理解就是:
request.inputstram这个只能读取一次,读取后就读取不到数据了。因为第二次再读取时可能已经到Stream的结尾了(EOFException)或者Stream已经close掉了,所以在此读取的时候需要从新设置下起始位置