如何在ASP.NET中获取原始请求主体?

时间:2011-06-15 18:53:18

标签: asp.net http

HttpApplication.BeginRequest事件中,我如何阅读整个原始请求正文?当我尝试阅读它时,InputStream长度为0,这让我相信它可能已经被ASP.NET读过了。

我试过像这样读取InputStream:

using (StreamReader reader = new StreamReader(context.Request.InputStream))
{
    string text = reader.ReadToEnd();
}

但我得到的只是一个空字符串。我已经将位置重置为0,但当然一旦读取了它就会消失,所以这样做不起作用。最后,检查流的长度返回0.

编辑:这适用于POST请求。

6 个答案:

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