基于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响应的实现。