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

时间:2015-08-27 19:28:35

标签: c# asp.net-core middleware asp.net-core-mvc

我是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);
        }
    }
}

我如何在中间件类中执行此操作?

2 个答案:

答案 0 :(得分:1)

我认为这样做的一种方法是拥有自己的IRouter实现。 以下是我作为测试使用自己的RouteHandler所做的事情,对我来说效果很好。

  1. 在我的项目中添加了MvcRouteHandlerMvcApplicationBuilderExtensions

  2. console.log(Object.getOwnPropertyDescriptor(numberOfRows, "count")); 的{​​{1}}方法中使用了Mynamespace.MvcRouteHandler,并将方法重命名为UseMvc

    MvcApplicationBuilderExtensions
  3. 在Startup.cs中,将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... }

  4. 然后在app.UseMvc的{​​{1}}方法中,根据自定义逻辑设置控制​​器和操作。

    app.UseMyMvc

答案 1 :(得分:0)