• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
PowerCoder
博客园    首页    新随笔    联系   管理    订阅  订阅

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?}");
    });
}

 

posted @ 2018-10-11 13:17  PowerCoder  阅读(1470)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3