基于HTTP标头区分MVC控制器的最佳方法
时间:2020-03-05 18:57:37 来源:igfitidea点击:
问题
我当前的项目要求我针对几乎每个操作基于不同的HTTP请求标头执行不同的操作。
当前,我有一个庞大的Controller(全部用于相同的资源类型),并且每个操作方法都具有ActionName属性(以便我可以具有相同操作的多个版本,这些版本具有相同的参数,但是执行不同的操作)和用于检查某些标头是否具有某些值的FilterAttribute(实现得几乎与Preview 5中的AcceptVerbsAttribute完全相同)。
我真的很想将代码推送到单独的Controller中,并让RouteTable根据标头在它们之间进行选择,但是想不出最干净的方法。
例子
例如,说我有一个文件列表。服务必须以以下两种方式之一处理请求:
- 客户端需要一个zip文件,并将" accept:application / zip"作为标题传递,我获取文件列表,将它们打包成一个zip文件,然后将其发送回客户端。
- 客户端需要一个html页面,因此它传递" accept:text / html",站点将以表格格式返回列出文件的html页面。
解决方案
回答
我不确定我们是否需要基于标头的单独控制器;这种结构听起来完全合理。如果控制器如我们所说的庞大,请考虑它是否在处理多个资源,如果是的话,也许应该根据资源将其拆分为多个控制器?
回答
不知道是否可能,但是好像是预览5中添加的AcceptVerbs属性。我将看看它是如何实现的(获取MVC源代码),看是否可以添加一些东西根据内容类型类似。
回答
听起来行为与基于输入的标头而导致的操作略有不同。我将尝试尽可能地隔离这些差异。
例如,如果应用程序逻辑相同,但是唯一的区别是向用户呈现响应的方式,则可以考虑编写自定义ActionResult,该自定义ActionResult基于Http标头采取不同的操作。
但是,如果逻辑完全不同,则可以实现添加到每个路由的自定义路由约束(IRoutConstraint)。看一下HttpMethodConstraint的实现思路。
回答
我们应该看看这篇文章。它描述了基于http标头的json和xml响应的实现。