如何将 Asp.NET 4.5 请求包装在 using { ... } 语句中?

How can I wrap an Asp.NET 4.5 request in a using { ... } statement?

为了更好地解释我想在 Asp.NET 4.5 中做什么,我将举例说明我是如何让它在 .NET Core 中工作的。

在 .NET Core 中,如果您希望请求的所有代码都使用单个对象,如果抛出异常,您可以使用 app.Use() 方法创建一个中间件Startup class 如下所示:

app.Use(async delegate (HttpContext Context, Func<Task> Next)
{
    using (var TheStream = new MemoryStream())
    {
        //the statement "await Next();" lets other middlewares run while the MemoryStream is alive.
        //if an Exception is thrown while the other middlewares are being run,
        //then the MemoryStream will be properly disposed
        await Next();
    }
});

我怎样才能在 .NET 4.5 中做这样的事情?我正在考虑使用 Global.asax.cs 但我必须跨越所有各种事件(Application_Start、Application_AuthenticateRequest 等)的 using { ... } 语句,但我不这样做相信不可能。

I was thinking of using the Global.asax.cs

是的,使用 HttpApplication.BeginRequestHttpApplication.EndRequest 这样的一对事件是在 ASP.NET pre-Core 上执行此操作的方法。

but I would have to span the using { ... } statement across all the various events

是的。您需要做的是将 using 逻辑拆分到这些事件中。例如,在 BeginRequest 事件中,执行 new MemoryStream() 并将其存储在请求上下文中。然后在 EndRequest 事件中,从请求上下文中检索 MemoryStream 并调用 Dispose.