Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从自定义中间件调用控制器和操作_C#_Asp.net Core_Middleware_Asp.net Core Mvc - Fatal编程技术网

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

C# 从自定义中间件调用控制器和操作,c#,asp.net-core,middleware,asp.net-core-mvc,C#,Asp.net Core,Middleware,Asp.net Core Mvc,我不熟悉ASP.NET5和中间件类。我试图创建的是一个中间件类,用于读取传入的URL请求。基于此,我要么让它通过并执行正常的路由查找,要么让中间件类从Web API类调用特定的控制器/操作 我目前的情况如下。我认为代码中的注释解释了我试图实现的目标 public class RouteMiddleware { private readonly RequestDelegate _next; public RouteMiddleware(RequestDelegate next)

我不熟悉ASP.NET5和中间件类。我试图创建的是一个中间件类,用于读取传入的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,它对我很有效

  • 在我的项目中添加和

  • mvcapapplicationbuilderExtensions
    UseMvc
    方法中使用了
    Mynamespace.MvcRouteHandler
    ,并将该方法重命名为
    usemymmvc

    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...
        }
    

  • 为什么不让路由引擎执行它的任务呢?让它使用属性routes将请求路由到所需的控制器?@HenkMollema主要用于学习目的。我只是想知道如何从中间件动态创建路由。当我想从另一个程序集/类库加载控制器时,它可以派上用场。与拥有自己的中间件和控制器类的类库类似,您可以创建重定向响应。
      context.RouteData.Values["area"] = "MyArea";
      context.RouteData.Values["controller"] = "MyController";
      context.RouteData.Values["action"] = "MyAction";