Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 基于HTTP头区分MVC控制器的最佳方法 问题_.net_Asp.net_Asp.net Mvc_Routing - Fatal编程技术网

.net 基于HTTP头区分MVC控制器的最佳方法 问题

.net 基于HTTP头区分MVC控制器的最佳方法 问题,.net,asp.net,asp.net-mvc,routing,.net,Asp.net,Asp.net Mvc,Routing,我当前的项目要求我根据几乎每个操作的不同HTTP请求头执行不同的操作 目前,我有一个大型控制器(都用于相同的资源类型),每个操作方法都有一个ActionName属性(这样我就可以拥有同一个操作的多个版本,使用相同的参数,但执行不同的操作)和一个自定义FilterAttribute(实现方式几乎与预览5中的AcceptVerbsAttribute完全相同)检查某些标头是否具有特定值 我真的很想将代码推送到单独的控制器中,并根据头在它们之间选择RouteTable,但想不出最干净的方法来实现这一点

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

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

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

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

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

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


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

    不确定是否有可能,但看起来这将是一个类似于接受谓词属性的东西。我想看看这是如何实现的(获取MVC源代码),看看是否可以根据内容类型添加类似的内容

    听起来您的行为与您的操作略有不同,这取决于输入的标题。我会尽可能地隔离这些差异

    例如,如果应用程序逻辑是相同的,但唯一的区别是如何将响应呈现给用户,您可能会考虑编写基于HTTP报头的不同操作的自定义Actuple结果。


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

    您应该查看。它描述了基于http头的json和xml响应的实现。

    I基于AcceptVerbs属性的当前代码。不过,这个示例只是一个简单的视图。我目前有24个不同的操作(另有8个计划),每个操作都有3-4个不同的标题,总共有86个不同的操作方法。目前没有处理多个不同的资源类型,只是在同一个资源上有许多不同的操作,其中大多数都需要基于“Accept”头的不同处理程序。我真不敢相信我居然没有想到这一点。