ASP.NET Core中怎么实现Url rewrite功能
我们可以使用ASP.NET Core的中间件来实现Url rewrite功能,下面我们定义一个中间件ReplaceQueryStringMiddleware来替换Http请求中的Url参数即QueryString,这相当于就是要用到以前ASP.NET的Url rewrite功能。
中间件ReplaceQueryStringMiddleware类:
public class ReplaceQueryStringMiddleware { private readonly RequestDelegate next; public ReplaceQueryStringMiddleware(RequestDelegate next) { this.next = next; } public async Task Invoke( Microsoft.AspNetCore.Http.HttpContext context) { var request = context.Request; var queryString = request.QueryString.Value; if (!string.IsNullOrWhiteSpace(queryString)) { //如果这里给context.Request.QueryString或context.Request.Path重新赋值,相当于就是Url rewrite了 request.QueryString = new QueryString("?demoKey=demoValue");//注意前面要加上问号,否者会报异常 } await next.Invoke(context); } }
中间件ReplaceQueryString的扩展类ReplaceQueryStringMiddlewareExtension:
public static class ReplaceQueryStringMiddlewareExtension { public static void UseReplaceQueryString(this IApplicationBuilder app) { app.UseMiddleware<ReplaceQueryStringMiddleware>(); } }
Startup类的Configure方法中启用ReplaceQueryString中间件
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { //启用ReplaceQueryString中间件 app.UseReplaceQueryString(); //因为我们在app.UseMvc之前调用了app.UseReplaceQueryString将URL的QueryString替换了,所以下面使用app.UseMvc后,在MVC Controller中用Request.QueryString读到的将会是替换后的"?demoKey=demoValue" //同样如果在app.UseReplaceQueryString中更改了context.Request.Path的值,那么在下面app.UseMvc后,MVC读到的Request.Path也是更改后新的Url值,这会导致MVC根据新的Url来调用不同的Controller和Action,实现了Url rewrite的功能 app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); }
效果:
此外,如果是一些简单的Url rewrite,那么直接在Startup类的Configure方法中用ASP.NET Core自带的中间件app.UseRewriter即可。
注意,从ASP.NET Core 3.X开始,在Startup类的Configure方法中,app.UseReplaceQueryString要放在app.UseRouting前面,这样如果在app.UseReplaceQueryString中更改了context.Request.Path的值,ASP.NET Core MVC才会根据新的Url来调用不同的Controller和Action,来实现Url rewrite的功能:
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Home/Error"); } app.UseStaticFiles(); app.UseReplaceQueryString(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); }); }
分类:
ASP.NET Core
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架