从自定义中间件调用控制器和操作

本文关键字:操作 控制器 调用 自定义 中间件 | 更新日期: 2023-09-27 18:10:04

我是ASP新手。. NET 5和中间件类。我试图创建的是一个中间件类,读取传入的URL请求。基于此,我要么想让它通过并执行正常的路由查找,要么我想让我的中间件类从我的Web API类调用特定的控制器/动作。

我目前拥有的是以下内容。我认为代码中的注释解释了我想要实现的目标。

public class RouteMiddleware
{
    private readonly RequestDelegate _next;
    public RouteMiddleware(RequestDelegate next)
    {
        _next = next;
    }
    public async Task Invoke(HttpContext httpContext)
    {
        if(httpContext.Request.QueryString.Value == "test")
        {
            // Call custom Controller / Action
            // Then, don't do any more route resolving, since we already have the right controller/action
        }
        else
        {
            // Continue like normal
            await _next.Invoke(httpContext);
        }
    }
}

我如何在我的中间件类中做到这一点?

从自定义中间件调用控制器和操作

我认为这样做的一种方法是通过有自己的实现IRouter。下面是我做的一个测试,我有自己的RouteHandler,它对我来说工作得很好。

  1. 在我的项目中添加了MvcRouteHandler和mvcapapplicationbuilderextensions .

  2. MvcApplicationBuilderExtensionsUseMvc方法中使用Mynamespace.MvcRouteHandler,并将其重命名为UseMyMvc

    public static IApplicationBuilder UseMyMvc(this IApplicationBuilder app,Action<IRouteBuilder> configureRoutes)
        {
            MvcServicesHelper.ThrowIfMvcNotRegistered(app.ApplicationServices);
            var routes = new RouteBuilder
            {
                DefaultHandler = new MyNamespace.MvcRouteHandler(),
                ServiceProvider = app.ApplicationServices
            };
         //..... rest of the code of this method here...
        }
    
  3. 在Startup.cs中将app.UseMvc更改为app.UseMyMvc

  4. 然后在MyNamespace.MvcRouteHandlerRouteAsync方法中,根据自定义逻辑设置控制器和动作。

      context.RouteData.Values["area"] = "MyArea";
      context.RouteData.Values["controller"] = "MyController";
      context.RouteData.Values["action"] = "MyAction";
    

这不是回答问题,但它听起来像你想要一个自定义路由处理程序:http://stephenwalther.com/archive/2015/02/07/asp-net-5-deep-dive-routinghttps://luisfsgoncalves.wordpress.com/2015/07/29/asp-net-5-routing-part-i/https://weblogs.asp.net/imranbaloch/custom-routing-aspnet5-mvc6