从中间件调用控制器的动作方法 [英] Call controller's action method from middleware

查看:0
本文介绍了从中间件调用控制器的动作方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的中间件类在不同的类库项目中,控制器在不同的项目中。我尝试做的是,如果特定条件不满足,则从中间件重定向到自定义控制器/操作方法。

但是,我无法使用Response.ReDirect方法执行此操作。

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

如有任何帮助,我将不胜感激!

RoHit

推荐答案

您似乎出于错误的原因使用了中间件。

我建议您或者让中间件通过简单地将其写入响应流(而不是转发到Next())来返回(非常小的)404,或者根本不在中间件中执行此操作,而是在MVC应用程序中全局注册的IActionFilter中执行此操作。


我已经在评论中解释了上述建议的理由,但我认为它足够重要,可以提升到实际答案中:

在中间件管道中,您希望每个组件尽可能独立。在OWIN中实现这种松散耦合的原因有两点:

  • 每个组件的输入和输出都具有相同的格式,无论它之前是否有10个其他中间件组件,或者根本没有中间件组件

  • 惯例是管道的每个部分都可以执行以下三项操作中的一项或多项:

    1. 读取(和修改)传入请求。

    2. 决定完全处理该请求,或将处理转发到下一个组件。

    3. 写入响应流。

      /li>
在遵守这些约定时,从可重用中间件组件组合、分解和重新组合管道变得非常容易。(想要记录请求吗?只需在管道的起始处连接一个中间件组件。想要一些通用的身份验证逻辑吗?在管道的身份验证阶段添加一个组件。想要切换到不同的日志框架吗?更换日志记录组件。想要在微服务生态系统中应用相同的日志记录吗?重复使用该组件。等等,直到无止境...)这非常有效,因为组件都保持在它们的边界内,并使用Web服务器本身可以理解的约定工作。

ASP.NET WebAPI看起来可能是一头不同的野兽,但实际上它只是另一个OWIN组件,它总是被配置为处理请求,并且永远不会转发到下一个组件(因此,它们使得在管道中注册WebApi之后的组件变得困难...)。

您尝试做的事情打破了第二点的约定--您想要告诉下一个组件如何处理请求。但这不由您决定-这取决于下一个组件。

这篇关于从中间件调用控制器的动作方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆