问题

我当前的项目要求我针对几乎每个操作根据不同的 HTTP 请求标头执行不同的操作。

目前,我有一个大型控制器(全部用于相同的资源类型),并且每个操作方法都有一个 ActionName 属性(这样我就可以拥有同一操作的多个版本,它们采用相同的参数,但执行不同的操作)和一个自定义FilterAttribute(实现几乎与预览版 5 中的 AcceptVerbsAttribute 完全相同),用于检查某些标头是否具有某些值。

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

例子

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

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

  2. 客户端想要一个 html 页面,因此它传递“accept:text/html”,站点发回一个列出文件的表格格式的 html 页面。

有帮助吗?

解决方案

听起来您的行为与根据传入的标头的操作略有不同。我会尝试尽可能地隔离差异。

例如,如果应用程序逻辑相同,但唯一的区别是如何向用户呈现响应,则您可以考虑编写一个自定义 ActionResult,它根据 Http 标头采取不同的操作。

但是,如果逻辑完全不同,您可以实现附加到每个路由的自定义路由约束 (IRoutConstraint)。查看 HttpMethodConstraint 的实现以获取想法。

其他提示

我不确定您是否需要基于标头的单独控制器;这个结构听起来非常合理。如果您的控制器像您所说的那样庞大,请考虑它是否正在处理多个资源,如果是,也许应该根据资源将其拆分为多个控制器?

不确定是否可能,但看起来这类似于 AcceptVerbs 属性 在预览版 5 中添加. 。我会看一下它是如何实现的(获取 MVC 源代码),看看是否可以根据内容类型添加类似的内容。

你应该看看 这个帖子. 。它描述了基于 http header 的 json 和 xml 响应的实现。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top