在HttpApplication.BeginRequest
事件中,如何读取整个原始请求体?当我尝试读取它时,InputStream
的长度为0,这让我相信它可能已经被ASP.NET读取了。
我试着这样阅读InputStream:
using (StreamReader reader = new StreamReader(context.Request.InputStream))
{
string text = reader.ReadToEnd();
}
但我得到的只是一个空字符串。我已经将位置重置回0,但是当然一旦流被读取,它就永远消失了,所以这不起作用。最后,检查流的长度返回0。
**编辑:**这是POST请求。
7条答案
按热度按时间5uzkadbs1#
BeginRequest事件中未填充请求对象。您需要在事件生命周期的后期访问此对象,例如Init、Load或PreRender。此外,您可能希望将输入流复制到内存流中,因此可以使用seek:
2wnc66cl2#
Pål's answer是正确的,但它也可以做得更短:
这是.NET 4.6。
velaa5lx3#
在ASP.NET Core 2中:
vx6bjr1n4#
我有一个类似的要求来获得原始内容,并击中了同样的问题。我发现调用
Seek(0, SeekOrigin.Begin)
解决了这个问题。这不是一个特别好的方法,因为它假设了底层基础设施如何运行,但它似乎有效。
9o685dep5#
重置InputStream的位置很重要。
lnlaulya6#
这是一个附加的答案上面,在任何人否决之前,请意识到我离能够评论1分之一(我有49,需要50评论)。我只是想做点贡献。
我用了帕尔的回答,我还是收到了一个空的身体。我意识到我的目标是一个http端点,而我的服务器被配置为将http升级为https。这样做,我失去了身体的内容。我将我的端点更改为https,这意味着我的服务器能够按原样接受请求。希望这能帮助到某人!
bwntbbo37#
这就是我最后做的: