代码之家  ›  专栏  ›  技术社区  ›  Alex Lyman

基于HTTP头区分MVC控制器的最佳方法

  •  3
  • Alex Lyman  · 技术社区  · 18 年前

    问题

    我当前的项目要求我为几乎每个操作基于不同的HTTP请求头做不同的事情。

    目前,我有一个大型控制器(对于相同的资源类型都有),每个操作方法都有一个actionname属性(这样我就可以拥有相同操作的多个版本,这些操作使用相同的参数,但执行不同的操作),以及一个自定义filterattribute(实现方式与预览5中的acceptVerbsattribute几乎完全相同)。检查某些头是否具有某些值。

    我真的很想把代码推到单独的控制器中,并让RouteTable根据头在它们之间进行选择,但是我想不出最干净的方法来做到这一点。

    例子

    例如,假设我有一个文件列表。服务必须以两种方式之一处理请求:

    1. 客户机需要一个zip文件,并将“accept:application/zip”作为头文件,我获取文件列表,将它们打包成一个zip文件,然后将其发送回客户机。

    2. 客户机需要一个HTML页面,所以它传递“accept:text/html”,该站点将返回一个表格式的HTML页面,列出文件。

    4 回复  |  直到 10 年前
        1
  •  4
  •   Haacked    18 年前

    听起来你的行为和你的动作有点不同,你的动作是基于哪个报头来的。我会尽可能地孤立这些差异。

    例如,如果应用程序逻辑相同,但唯一的区别是如何将响应呈现给用户,则可以考虑编写一个自定义的actionresult,它根据HTTP头执行不同的操作。

    但是,如果逻辑完全不同,则可以实现附加到每个路由的自定义路由约束(IRoutConstraint)。看看httpmethodconstraint的实现,了解其思想。

        2
  •  0
  •   Aeon    18 年前

    我不确定您是否需要基于标题的独立控制器;这种结构听起来非常合理。如果您的控制器像您所说的那样庞大,那么考虑它是否处理多个资源,如果是,那么它可能应该根据资源划分为多个控制器?

        3
  •  0
  •   Bryant    18 年前

    不确定是否可能,但似乎这类似于acceptVerbs属性 added in Preview 5 . 我将看看它是如何实现的(获取MVC源代码),看看您是否可以根据内容类型添加类似的内容。

        4
  •  0
  •   JBert    10 年前

    你应该看看 this post . 它描述了基于HTTP头的JSON和XML响应的实现。