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

t2a7ltrp  于 2023-06-25  发布在  .NET
关注(0)|答案(7)|浏览(185)

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

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

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

**编辑:**这是POST请求。

5uzkadbs

5uzkadbs1#

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();
    }
}
2wnc66cl

2wnc66cl2#

Pål's answer是正确的,但它也可以做得更短:

string req_txt;
using (StreamReader reader = new StreamReader(HttpContext.Current.Request.InputStream))
{
    req_txt = reader.ReadToEnd();
}

这是.NET 4.6。

velaa5lx

velaa5lx3#

在ASP.NET Core 2中:

using (var reader = new StreamReader(HttpContext.Request.Body)) {
    var body = reader.ReadToEnd();
}
vx6bjr1n

vx6bjr1n4#

我有一个类似的要求来获得原始内容,并击中了同样的问题。我发现调用Seek(0, SeekOrigin.Begin)解决了这个问题。
这不是一个特别好的方法,因为它假设了底层基础设施如何运行,但它似乎有效。

9o685dep

9o685dep5#

重置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);
}
lnlaulya

lnlaulya6#

这是一个附加的答案上面,在任何人否决之前,请意识到我离能够评论1分之一(我有49,需要50评论)。我只是想做点贡献。
我用了帕尔的回答,我还是收到了一个空的身体。我意识到我的目标是一个http端点,而我的服务器被配置为将http升级为https。这样做,我失去了身体的内容。我将我的端点更改为https,这意味着我的服务器能够按原样接受请求。希望这能帮助到某人!

bwntbbo3

bwntbbo37#

这就是我最后做的:

//Save the request content. (Unfortunately it can't be written to a stream directly.)
context.Request.SaveAs(filePath, false);

相关问题