在HttpApplication.BeginRequest
事件中,我如何阅读整个原始请求正文?当我尝试阅读它时,InputStream
长度为0,这让我相信它可能已经被ASP.NET读过了。
我试过像这样读取InputStream:
using (StreamReader reader = new StreamReader(context.Request.InputStream))
{
string text = reader.ReadToEnd();
}
但我得到的只是一个空字符串。我已经将位置重置为0,但当然一旦读取了它就会消失,所以这样做不起作用。最后,检查流的长度返回0.
编辑:这适用于POST请求。
答案 0 :(得分:14)
BeginRequest事件中未填充请求对象。您需要稍后在事件生命周期中访问此对象,例如Init,Load或PreRender。此外,您可能希望将输入流复制到内存流,因此可以使用seek:
protected void Page_Load(object sender, EventArgs e)
{
MemoryStream memstream = new MemoryStream();
Request.InputStream.CopyTo(memstream);
memstream.Position = 0;
using (StreamReader reader = new StreamReader(memstream))
{
string text = reader.ReadToEnd();
}
}
答案 1 :(得分:6)
Pål's answer是正确的,但也可以做得更短:
string req_txt;
using (StreamReader reader = new StreamReader(HttpContext.Current.Request.InputStream))
{
req_txt = reader.ReadToEnd();
}
这适用于.NET 4.6。
答案 2 :(得分:4)
我有类似的要求获取原始内容并遇到同样的问题。我发现调用Seek(0, SeekOrigin.Begin)
解决了这个问题。
这不是一个特别好的方法,因为它假设底层基础设施如何运作,但似乎有效。
答案 3 :(得分:2)
在ASP.NET Core 2中:
using (var reader = new StreamReader(HttpContext.Request.Body)) {
var body = reader.ReadToEnd();
}
答案 4 :(得分:1)
重置InputStream的位置非常重要。
var memstream = new MemoryStream();
Request.InputStream.CopyTo(memstream);
Request.InputStream.Position = 0;
using (StreamReader reader = new StreamReader(memstream)) {
var text = reader.ReadToEnd();
Debug.WriteLine(text);
}
答案 5 :(得分:-3)
这是我最终做的事情:
//Save the request content. (Unfortunately it can't be written to a stream directly.)
context.Request.SaveAs(filePath, false);