读取 post 请求内容,最方便的就是使用 stream 了(如下),单个 filter 没问题,但是如果同一个 controller 附加
两个 filter 就有问题了,第一个 filter 可以正常读取内容,但是之后的在读 stream 的长度就是 0 了。

public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext context)

{

var task = context.Request.Content.ReadAsStreamAsync();

var content = string.Empty;

using (System.IO.Stream sm = task.Result)

{

if (sm != null)

{

sm.Seek(0, SeekOrigin.Begin);

int len = (int) sm.Length;

byte[] inputByts = new byte[len];

sm.Read(inputByts, 0, len);

sm.Close();

content = Encoding.UTF8.GetString(inputByts);

}

}

}



试了好几种办法:想用 clone 复制一个 stream 结果没有成功。


最后解决方法是:
1.将 stream 读到 byte[] 数组中
2.将 byte[] 在转成 string 
3.将每个 filter 中读取 post 内容的位置均写成这种形式,就都可以读到了


代码实例:

//读取post内容

var task = context.Request.Content.ReadAsStreamAsync();

var content = string.Empty;

var sm = task.Result;

sm.Seek(0, SeekOrigin.Begin);//设置流的开始位置

var bytes = sm.ToByteArray();

content = bytes.ToStr();



用到的几个扩展方法:

1.stream 转 byte[]

/// <summary>

/// Stream Stream 转换为 byte 数组

/// </summary>

/// <returns></returns>

public static byte[] ToByteArray(this Stream stream)

{

byte[] bytes = new byte[stream.Length];

stream.Read(bytes, 0, bytes.Length);

// 设置当前流的位置为流的开始

stream.Seek(0, SeekOrigin.Begin);

return bytes;

}




2.byte[] 转 string

/// <summary>

/// 转换为 string,使用 Encoding.Default 编码

/// </summary>

/// <returns></returns>

public static string ToStr(this byte[] arr)

{

return System.Text.Encoding.Default.GetString(arr);

}