专栏首页圣杰的专栏ASP.NET Core知多少(13):路由重写及重定向

ASP.NET Core知多少(13):路由重写及重定向

背景

在做微信公众号的改版工作,之前的业务逻辑全塞在一个控制器中,现需要将其按厂家拆分,但要求入口不变。

拆分很简单,定义控制器基类,添加公用虚方法并实现,各个厂家按需重载。

但如何根据统一的入口参数路由到不同的控制器呢?

最容易想到的方案无外乎两种:

  1. 路由重定向
  2. 路由重写

简易方案

但最最简单的办法是在进入ASP.NET Core MVC路由之前,写个中间件根据参数改掉请求路径即可,路由的事情还是让MVC替你干就好。

定义自定义中间件:

public class CustomRewriteMiddleware
{
    private readonly RequestDelegate _next;

    //Your constructor will have the dependencies needed for database access
    public CustomRewriteMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        var path = context.Request.Path.ToUriComponent().ToLowerInvariant();
        var thingid = context.Request.Query["thingid"].ToString();

        if (path.Contains("/lockweb"))
        {
            var templateController = GetControllerByThingid(thingid);

            context.Request.Path =  path.Replace("lockweb", templateController);
        }

        //Let the next middleware (MVC routing) handle the request
        //In case the path was updated, the MVC routing will see the updated path
        await _next.Invoke(context);

    }

    private string GetControllerByThingid(string thingid)
    {
        //some logic
        return "yinhua";
    }
}

在startup config方法注入MVC中间件之前,注入自定义的重写中间件即可。

public void Configure(IApplicationBuilder app
{
  //some code
  app.UseMiddleware<CustomRewriteMiddleware>();
  app.UseMvcWithDefaultRoute();
}

目前这个中间件还是有很多弊端,只支持get请求的路由重写,不过大家可以根据项目需要按需改造。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • eShopOnContainers 知多少[6]:持久化事件日志

    事件总线解决了微服务间如何基于集成事件进行异步通信的问题。然而只有事件总线正常运行,微服务之间基于事件的通信才得以运转。 而现实情况是,总有这样或那样的问题,...

    圣杰
  • DDD理论学习系列(9)-- 领域事件

    1. 引言 A domain event is a full-fledged part of the domain model, a representati...

    圣杰
  • ASP.NET Core知多少(6):VS Code联调Angular + .NetCore

    1. 引言 最近在看《程序员的成长课》,讲到程序员如何构建技能树,印象深刻。作为一名后台开发的程序员,深感技能单一,就别说技能树了。作为一名合格的后台程序员,至...

    圣杰
  • C# 温故而知新:Stream篇(七)

    NetworkStream 目录: NetworkStream的作用 简单介绍下TCP/IP 协议和相关层次 简单说明下 TCP和UDP的区别 简单介绍下套接字...

    逸鹏
  • Angular 2 + 折腾记 :(4)初步了解路由及使用

    路由就是控制视图与视图之间的跳转,之间还可以传递参数什么的,路由的退后及前进不会完整的请求整个页面,还可以完全不请求(在生命周期里面控制);

    CRPER
  • SLua-Lua调用自定义C#类

    在Lua中通过Resources.load加载一个图片只能得到testure2D,而我们使用UGUI想改变Image的图片的时候需要的是Sprite图片,这时我...

    祝你万事顺利
  • Hexo优化 --- 利用 Markdown 语法画流程图

    一份执着✘
  • 一分钟告诉面试官TIME_WAIT

    [FIN_WAIT1] :FIN_WAIT1和FIN_WAIT2均为等待对方的FIN报文。两者区别为,当SOCKET在ESTABLISHED状态时,想主动关闭连...

    我是程序员小贱
  • TIME_WAIT 的那些事

    我们知道 TCP 在关闭连接的时候,主动断开的一方将处于 TIME_WAIT 状态,并将持续两倍的 MSL。这个 MSL 在 RFC 793 中的建议是 1 分...

    小徐
  • 华为深度学习框架MindSpore正式开源:自动微分不止计算图

    今年的华为开发者大会 HDC 2020 上,除了昇腾、鲲鹏等自研芯片硬件平台之外,最令人期待的就是深度学习框架 MindSpore 的开源了。今天上午,华为 M...

    机器之心

扫码关注云+社区

领取腾讯云代金券