C# 为什么自定义中间件仍在运行?
平台 .Net核心2.2 Web应用程序 场景 我编写了一些自定义中间件,目的是仅在请求路径与指定位置匹配时执行。当它运行时,它从数据库中进行查找并检查一段数据。在某些情况下,中间件会将用户重定向到新的url,而不是让他们查看请求的url 问题 中间件似乎被缓存了或者其他什么东西。我不明白。当我请求应该可以工作的C# 为什么自定义中间件仍在运行?,c#,.net,.net-core,asp.net-core-2.1,C#,.net,.net Core,Asp.net Core 2.1,平台 .Net核心2.2 Web应用程序 场景 我编写了一些自定义中间件,目的是仅在请求路径与指定位置匹配时执行。当它运行时,它从数据库中进行查找并检查一段数据。在某些情况下,中间件会将用户重定向到新的url,而不是让他们查看请求的url 问题 中间件似乎被缓存了或者其他什么东西。我不明白。当我请求应该可以工作的localhost:6000/url时,我神奇地在另一个url上得到了错误的页面。然而,当我使用Fiddler时,它不是重定向。这就像是我实际要求的页面。奇怪的是a)我在Startup.
localhost:6000/url时,我神奇地在另一个url上得到了错误的页面。然而,当我使用Fiddler时,它不是重定向。这就像是我实际要求的页面。奇怪的是a)我在Startup.cs
中注释了我的中间件代码,b)当我进入匿名模式时,行为按预期工作。此外,如果我将调试端口更改为其他端口,它也可以工作。此外,当我在中间件中放置断点时,如果我转到应该工作的/url,则请求路径是错误的url
代码
Startup.cs
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseAuthentication();
//app.UseEndpointRouting();
//app.UseWhen(context => context.Request.Path.StartsWithSegments("/move/booking"), appBuilder =>
//{
// appBuilder.UseMoveBookingWorkflowPermission();
//});
app.UseMvc();
不应执行的中间件重定向行
context.Response.Redirect(context.Request.PathBase + previousPath + context.Request.QueryString, true);
根据.Net核心文档
您的中间件的顺序可以更改其功能,
安全性和性能
例如,在此配置中,在Startup.cs
public void Configure(IApplicationBuilder app)
{
app.UseStaticFiles();
app.UseResponseCompression();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
静态文件不使用此中间件顺序进行压缩。这些响应可以被压缩。这个简单的例子展示了功能将如何改变。
在Configure方法中,它可以做出响应,也可以将请求传递给下一个中间件
var options = new RewriteOptions()
.AddRewrite(//some options);
app.UseRewriter(options);
如果仍然存在问题,可以重写URL中间件
var options = new RewriteOptions()
.AddRewrite(//some options);
app.UseRewriter(options);
希望能有帮助 根据.Net核心文档
您的中间件的顺序可以更改其功能,
安全性和性能
例如,在此配置中,在Startup.cs
public void Configure(IApplicationBuilder app)
{
app.UseStaticFiles();
app.UseResponseCompression();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
静态文件不使用此中间件顺序进行压缩。这些响应可以被压缩。这个简单的例子展示了功能将如何改变。
在Configure方法中,它可以做出响应,也可以将请求传递给下一个中间件
var options = new RewriteOptions()
.AddRewrite(//some options);
app.UseRewriter(options);
如果仍然存在问题,可以重写URL中间件
var options = new RewriteOptions()
.AddRewrite(//some options);
app.UseRewriter(options);
希望能有帮助 这是一个“我很愚蠢”的时刻。问题是,当我重定向响应时,我指定希望它是永久的
旧的
context.Response.Redirect(context.Request.PathBase + previousPath + context.Request.QueryString, true);
新的
context.Response.Redirect(context.Request.PathBase + previousPath + context.Request.QueryString, false);
这是一个“我很愚蠢”的时刻。问题是,当我重定向响应时,我指定希望它是永久的
旧的
context.Response.Redirect(context.Request.PathBase + previousPath + context.Request.QueryString, true);
新的
context.Response.Redirect(context.Request.PathBase + previousPath + context.Request.QueryString, false);
您面临的问题可能是由浏览器缓存引起的。为什么不尝试在响应中添加一个可以禁用缓存的头?@HirasawaYui我不知道浏览器如何缓存代码,但这就是它看起来的行为。你知道我会把头球放在哪里,或者它会是什么样子吗?我对自定义中间件有点陌生。您是否在启动结束时配置中间件?在route或MVC配置后的末尾添加中间件。@James没关系,即使是最好的开发人员有时也会犯愚蠢的错误。您面临的问题可能是由浏览器缓存引起的。为什么不尝试在响应中添加一个可以禁用缓存的头?@HirasawaYui我不知道浏览器如何缓存代码,但这就是它看起来的行为。你知道我会把头球放在哪里,或者它会是什么样子吗?我对自定义中间件有点陌生。你是在启动结束时配置中间件的吗?在route或MVC配置结束后添加中间件。@James没关系,即使是最好的开发人员有时也会犯愚蠢的错误