3

问题

我当前的项目要求我根据几乎每个操作的不同 HTTP 请求标头做不同的事情。

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

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

例子

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

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

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

4

4 回答 4

4

听起来您的行为与基于哪个标头进入的操作略有不同。我会尝试尽可能地隔离这些差异。

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

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

于 2008-09-17T15:48:18.970 回答
0

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

于 2008-09-17T01:13:42.847 回答
0

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

于 2008-09-17T01:15:29.113 回答
0

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

于 2009-03-14T02:05:36.033 回答