我正在使用.NET 5 / Core并创建了最基本的ASP.NET Core Web应用程序来理解.NET Core基础知识(我的代码如下),但我的私有类字段/属性的行为类似于静态字段和在HTTP请求之间保留其值。我想了解为什么,如何以最简单的方式解决这个问题,以及是否存在多种解决方案/方法。
我将'输出'字符串声明为私有非静态字段,我假设应该使用每个新的HTTP请求重置它,但它的行为类似于静态字段/属性,每个新页面刷新都会导致更长的时间和更长的输出,保留以前的值并添加一个新值。
例如,网页首先显示输出/
,但在刷新页面多次后,我看到以下5个输出已合并
/
/favicon.ico
/
/favicon.ico
/
favicon.ico
不是问题,我知道我的网络浏览器正在请求它。上面的输出显示在前3页刷新之后,而每个额外的页面刷新输出两个以上的这些行,因为Web浏览器提交2个HTTP请求。
我可能会使用services.AddScoped
或services.AddTransient
来提出解决方案,但不确定为什么在这种情况下需要服务,因为每个HTTP请求似乎都是单独处理的,应该重新初始化我的RequestHandler类。我错过了一些简单的东西,有没有办法在我的示例代码的简单级别处理它?</ p>
我的整个应用程序包含以下Startup.cs:
using System.Threading.Tasks;
using Microsoft.AspNet.Builder;
using Microsoft.AspNet.Http;
namespace BasicApp
{
public class Startup
{
public static void Main()
{
}
public void Configure(IApplicationBuilder app)
{
app.UseMiddleware<RequestHandler>();
}
}
public class RequestHandler
{
RequestDelegate _next;
private string Output = "";
public RequestHandler(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
Output += context.Request.Path + "\n";
await context.Response.WriteAsync(Output);
}
}
}
答案 0 :(得分:3)
中间件类仅通过IApplicationBuilder.UseMiddleware{T}
实例化一次,并放入请求管道中。 ASP.NET documentation on this可以很好地解释这个过程。
您可以通过IApplicationBuilder.Run
方法获得简单的响应:
public void Configure(IApplicationBuilder app)
{
app.Run(async context =>
{
await context.Response.WriteAsync(context.Request.Path);
});
}
另一种思考方式是,中间件类会根据每个请求实例化RequestHandler
:
public class Startup
{
public Startup(IHostingEnvironment env)
{
}
public void Configure(IApplicationBuilder app)
{
app.UseMiddleware<RequestHandlerMiddleware>();
}
public static void Main(string[] args) => WebApplication.Run<Startup>(args);
}
public class RequestHandlerMiddleware
{
RequestDelegate _next;
public RequestHandlerMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
var handler = new RequestHandler();
await handler.HandleRequestAsync(context);
await _next.Invoke(context); // invoke the next delegate in the pipeline
}
}
public class RequestHandler
{
private string Output = "";
public async Task HandleRequestAsync(HttpContext context)
{
Output += context.Request.Path + "\n";
await context.Response.WriteAsync(Output);
}
}