C# request.GetBufferedInputStream未启用寻道

C# request.GetBufferedInputStream未启用寻道,c#,asp.net-mvc,stream,.net-4.5,C#,Asp.net Mvc,Stream,.net 4.5,在.NET4.5之前,我使用request.InputStream读取数据并将其保存到数据库中。然而,现在它不再使用“经典”输入流读取机制,而是使用缓冲输入流 在模块中,当我尝试读取流时,我必须检查模式。但是我无法读取BufferedInputStream,因为它已经被读取,并且不可查看 基本上我在一个模块里有这个 public void Init(HttpApplication context) { context.EndRequest += EndRequest; } privat

在.NET4.5之前,我使用request.InputStream读取数据并将其保存到数据库中。然而,现在它不再使用“经典”输入流读取机制,而是使用缓冲输入流

在模块中,当我尝试读取流时,我必须检查模式。但是我无法读取BufferedInputStream,因为它已经被读取,并且不可查看

基本上我在一个模块里有这个

public void Init(HttpApplication context)
{
    context.EndRequest += EndRequest;
}

private void EndRequest(object sender, EventArgs e)
{
    var application = (HttpApplication)sender;
    var request = application.Request;

    Stream requestInputStream = null;
    if (application.Request.ReadEntityBodyMode == ReadEntityBodyMode.Buffered)
    {
        // This is not readable...
        requestInputStream = request.GetBufferedInputStream();
    }
    else
    {
        requestInputStream = request.InputStream;
    }
}
我现在发现的唯一技巧是访问
BeginRequest
中的request.InputStream,然后在该点保存流。然而,我的流将永远停留在经典模式;我相信这会破坏这个.NET4.5缓冲输入流的目的

现在有更好的方法读取这个BufferedInputStream吗


(完整代码开源:)

您可能不希望在RequestEnd事件中执行此操作。您确定在处理此请求期间没有人调用Request.Form或Request.Files等吗?因为在任何一种情况下,当EndRequest被激发时,所有内容都将被读取。在早期版本的.net中,已经可以通过小缓冲区读取输入流。这取决于您访问流的执行阶段。@OguzOzgul感谢您的反馈。既然.NET4.5将使用缓冲流,您是否知道如何以及何时读取请求流?是的。您可以使用PreRequestHandlerExecute事件处理程序中的GetBufferedInputStream读取流。此事件处理程序是在ASP.NET开始执行事件处理程序(页面、自定义处理程序、web服务等)之前调用的,如果没有其他http模块已经读取了请求,我们可以预期此时不会完全读取该请求。使用这个特定的事件处理程序可以确保请求经过身份验证,会话可用,并且知道实际的处理程序(这可能是日志记录所需要的)