MVC3 RESTful API 路由和 Http 动词处理

2024-05-26

我想为我的 MVC3 应用程序构建 RESTful Json Api。我需要帮助处理多个 Http Verbs 以操作单个对象实例。

我读过/研究过/尝试过的内容

MVC 属性(HttpGet, HttpPost等)允许我拥有一个具有多个共享相同名称的操作的控制器,但它们仍然必须具有不同的方法签名。

路由约束发生在路由模块中beforeMVC 启动后会导致我有 4 个显式路由,并且仍然需要单独命名的控制器操作。

ASP.NET MVC AcceptVerbs 和注册路由 https://stackoverflow.com/questions/283209/asp-net-mvc-acceptverbs-and-registering-routes

构建自定义 Http Verb 属性可用于获取用于访问操作的动词,然后在调用操作时将其作为参数传递 - 然后代码将处理 switch 情况。这种方法的问题是某些方法需要授权,这些授权应该在操作过滤器级别处理,而不是在操作本身内部处理。

http://iwantmymvc.com/rest-service-mvc3 http://iwantmymvc.com/rest-service-mvc3


要求/目标

  1. 单个实例对象的一个​​路由签名,MVC 预计会处理四个主要的 Http Verb:GET、POST、PUT、DELETE。

    context.MapRoute("Api-SingleItem", "items/{id}", 
        new { controller = "Items", action = "Index", id = UrlParameter.Optional }
    );
    
  2. 当 URI 未传递 Id 参数时,操作必须处理POST and PUT.

    public JsonResult Index(Item item) { return new JsonResult(); }
    
  3. 当 Id 参数传递到 URI 时,单个操作应该处理GET and DELETE.

    public JsonResult Index(int id) { return new JsonResult(); }
    

Question

我怎样才能有多个操作(共享相同的名称和方法签名),每个操作都响应一个唯一的 http 动词。所需的示例:

[HttpGet]
public JsonResult Index(int id) { /* _repo.GetItem(id); */}

[HttpDelete]
public JsonResult Index(int id) { /* _repo.DeleteItem(id); */ }

[HttpPost]
public JsonResult Index(Item item) { /* _repo.addItem(id); */}

[HttpPut]
public JsonResult Index(Item item) { /* _repo.updateItem(id); */ }

对于 RESTful 调用,该操作没有任何意义,因为您只想通过 HTTP 方法进行区分。因此,技巧是使用静态操作名称,以便控制器上的不同方法仅在它们接受的 HTTP 方法上有所不同。

虽然MVC框架提供了指定action名称的解决方案 https://stackoverflow.com/questions/6348372,它可以变得更加简洁和不言自明。我们是这样解决的:

特殊属性用于指定 RESTful 方法(这与特殊操作名称匹配):

public sealed class RestfulActionAttribute: ActionNameSelectorAttribute {
    internal const string RestfulActionName = "<<REST>>";

    public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo) {
        return actionName == RestfulActionName;
    }
}

控制器将其与 HTTP 方法属性结合使用:

public class MyServiceController: Controller {
    [HttpPost]
    [RestfulAction]
    public ActionResult Create(MyEntity entity) {
        return Json(...);
    }

    [HttpDelete]
    [RestfulAction]
    public ActionResult Delete(Guid id) {
        return Json(...);
    }

    [HttpGet]
    [RestfulAction]
    public ActionResult List() {
        return Json(...);
    }

    [HttpPut]
    [RestfulAction]
    public ActionResult Update(MyEntity entity) {
        return Json(...);
    }
}

为了成功绑定这些控制器,我们使用带有前面提到的属性中的静态操作名称的自定义路由(同时也允许自定义 URL):

routes.MapRoute(controllerName, pathPrefix+controllerName+"/{id}", new {
    controller = controllerName,
    action = RestfulActionAttribute.RestfulActionName,
    id = UrlParameter.Optional
});

请注意,据我所知,这种方法可以轻松满足您的所有要求;您可以在一种方法上拥有多个 [HttpXxx] 属性,以使一种方法接受多个 HTTP 方法。与一些智能的 ModelBinder 配合使用,这是非常强大的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MVC3 RESTful API 路由和 Http 动词处理 的相关文章

  • 身份服务器刷新令牌资源所有者密码凭证流程

    我正在使用 IdentityServer 来控制对 API 的访问 我有一个单独的身份验证 API 它发出令牌并验证访问请求以确保 API 的安全 我让用户能够通过安全的 Web 应用程序生成访问令牌 我正在使用资源所有者密码凭证流程 有没
  • _Layout.cshtml无法直接请求,因为它调用了“RenderBody”方法

    我使用属性来路由 这是否相关 我不知道 当我不使用 Route 属性时 共享控制器中的 Layaout 操作不起作用 但页面正在呈现 public class SharedController Controller GET Shared A
  • .net 4.7 中的依赖注入?

    我对 DI 有哪些集成选项有点困惑 我发现它对于 net core 对于我的特定项目 来说非常简单 但我不需要构建跨平台应用程序 也看不到使用 core 的优势 但是 net 框架应用程序似乎仍然使用 Global asax 设置且没有 S
  • mvc 2中的图像上传和预览

    我正在通过转换 asp net 网站来学习 mvc 2 在我的页面中 我必须上传图像并显示图像的预览 下面给出了我的 asp net 页面的屏幕截图 我将模型创建为 public class Contest public int conte
  • LinkedIn Groups API - 在单个 API 请求中获取多个群组的群组徽标

    Using LinkedIn 群组 API http developer linkedin com documents groups api 我正在显示用户在 LinkedIn 上所属的组列表 使用以下命令可以清楚地在一次调用中获取组列表
  • 为什么自定义类型变量不保存值MVC

    我正在尝试使用 MVC 5 构建一个网站 我有一个包含 3 个变量的控制器类 public class WorkerController Controller public ViewModel viewModel new ViewModel
  • 有没有更好的方法使用 MVC 4 和 Entity Framework 5 添加子记录?

    我正在学习 MVC 并结合实体框架处理其无状态性质 我的问题是 有没有更优雅的方式来处理下面的场景 我有两个 POCO 实体 public class Contest public long ID get set public IColle
  • 如何根据 ASP.NET VNEXT MVC6 中给出的路径进行虚拟路由/重定向?

    我有一个网站 它在不同的路径上公开多个 API 每个 API 由特定于应用程序部分的控制器处理 例如example com Api Controller Action param1 stuff 其中控制器发生变化 但操作保持相当一致 我有几
  • 如何将 Orchard CMS 与当前的 MVC2 应用程序集成?

    对于我的项目 客户端有一个现有的 ASP NET MVC 2 Web 应用程序 该应用程序具有产品目录和购物车功能 客户正在重新设计他们的网站 并希望使用 Orchard 来维护他们的内容页面 例如主页 关于 服务等 他们希望尽可能多地使用
  • Jersey 和 Spring 中的全局异常处理?

    我正在使用 Jersey 和 Spring 3 2 以及 Open CMIS 开发 RESTful Web 服务 我没有使用 Spring 的 MVC 模式 它只是 Spring IOC 和 Jersey SpringServlet 控制器
  • 以 RESTful 方式增加资源计数器:PUT 与 POST

    我有一个带有计数器的资源 为了举例 我们将该资源称为profile 计数器是数量views对于该配置文件 Per the 休息维基 http rest blueoxen net cgi bin wiki pl HttpMethods PUT
  • ASP.NET MVC 子操作的路由匹配

    子动作的路由匹配方法与普通动作有什么不同吗 换句话说 子操作是否有一些自动生成的 url 来进行与父操作类似的匹配 父级或子级动作处理没有区别 任何操作都遵循您在中设置的相同路线定义Application Start 这意味着父母的行为以及
  • 如何从 Android 调用 RESTful 方法?

    我尝试了两种不同的方法来从 Android 调用简单的 REST 方法 所述 REST 方法 适用于其他客户端 仅返回一个 int val 例如 17 以下两次尝试都是基于我在网上找到的代码 有一种是这样的 公共无效onFetchBtnCl
  • MVC 项目中的 .Rdlc 报告 - 托管调试助手“PInvokeStackImbalance”

    我即将完成并运行我的上一份报告 我在其他报告中没有遇到过这个问题 我正在尝试根据数据库记录创建报告 当我通过 LocalReport 创建报告并为报告创建参数时 收到错误消息 托管调试助手 PInvokeStackImbalance 调用
  • asp.net mvc:将 RedirectToAction(string, object) 转换为 RedirectToAction(x => x.Detail(id))

    任何人都知道如何创建一个方法 我将把它放在扩展类中 该方法将仅使用表达式 无魔术字符串 与 mvc 的 RedirectToAction 执行相同的操作 所以不要写这样的东西 RedirectToAction Detail new Rout
  • ASP.NET MVC 应用程序中的工作单元模式

    我一直在看这个优秀的blog http www nhforge org wikis patternsandpractices nhibernate and the unit of work pattern aspx标题为 NHibernat
  • Visual Studio 智能感知搞砸了

    所以我是 MVC4 和 C 的新手 我已经设计这个网站大约两周了 智能感知没有任何问题 两天来 Visual studio 告诉我 Viewbag 和其他 命令不是我的项目的一部分 我可能错过了一些东西 或者它告诉我 Viewbag 在当前
  • 使用 AJAX 加载部分视图不起作用

    请原谅我 我是 MVC 和 AJAX 的新手 目前我只是提交一个表单 我想使用表单中的数据使用 ajax 更新部分视图中的表 My UserInfo部分视图如下所示 model IEnumerable
  • 当集合提交回控制器时,未将对象引用设置为对象的实例。错误

    我正在更新多条记录 单击提交按钮后出现错误 这表明控制器收到 NULL 并在第 36 行报告以下错误 下面是我的控制器 视图和模型的代码 你调用的对象是空的 描述 执行当前 Web 请求期间发生未处理的异常 请检查堆栈跟踪 有关该错误及其起
  • 良好的 WiX 编辑器 [重复]

    这个问题在这里已经有答案了 我目前正在开发一个使用 WiX 创建 MSI 的项目 我过去在 Sourceforge 上使用 WiXEdit 来管理包含在 WiX 项目中的文件 因为它比直接操作 XML 稍微容易一些 但它仍然有点笨重 有谁知

随机推荐

  • 高负载应用程序的数据库可扩展性?

    我见过一些应用程序拥有集群 Web 服务器 例如 10 到 20 个服务器 以具有可扩展性 可以在其中分发 在网络服务器之间加载 但我总是看到所有网络服务器都使用单个数据库 现在考虑任何电子商务或铁路 Web 应用程序 其中有数百万用户在任
  • json.Unmarshal json字符串到对象是空结果[重复]

    这个问题在这里已经有答案了 我有一个非常简单的程序 如下所示 package main import encoding json fmt type RunCommand struct level string json level call
  • 如何在 Android 上重复使用 AlertDialog 来表示是/否?

    我正在尝试找到重用显示自定义标题的对话框的方法 然后将 是 否 单击发送到启动该对话框的函数 我有两个按钮 保存 和 关闭 两者都调用 是 否 对话框 一个显示 您要保存 另一个显示 关闭更改吗 我认为我的程序非常 脏 但我想它可以工作 但
  • 如何在 C# 中重构 log4net 语句?

    好吧 读完丹本对此的回答后post https stackoverflow com questions 2230180 whats log4j actually doing when we turn on or off some log p
  • 在 foreach 循环中启动一个新线程

    我有一个对象列表 我想循环该列表并启动一个新线程 传入当前对象 我写了一个我认为应该这样做的例子 但它不起作用 具体来说 线程似乎在每次迭代中都被覆盖 但这对我来说并没有什么意义 因为我每次都会创建一个新的 Thread 对象 这是我写的测
  • jquery addClass() 不适用于 event.target

    请帮忙 为什么是jqueryaddClass 不与event target 我已经编写了一个代码 它应该在单击时在目标上添加类 但它不起作用 它说 e target addClass不是一个函数 http jsfiddle net Lq9G
  • Final 是否意味着覆盖?

    据我了解 override关键字表明给定的声明实现了一个基类virtual方法 如果没有找到匹配的基方法 编译就会失败 我的理解final关键字是它告诉编译器任何类都不能重写它virtual功能 So is override final多余
  • WPF DataGrid 显示点而不是逗号

    在网上查找并寻找答案后没有结果 我想向您寻求帮助 我有一个包含 2 列的 SQL 数据库表 浮点数据类型 例如 1 2 1 3 1 4 等 绑定到一个DataGrid XAML 代码
  • 随机化数组元素

    我有一个数组 number 1 2 3 4 5 6 7 8 9 现在 我想随机化数组内容 例如 5 3 2 6 7 1 8 请指导我如何继续 Use the shuffle方法 irb main 001 0 gt 1 2 3 4 5 shu
  • 在具有循环依赖关系的大型对象上调用 JSON.stringify 时出现“太多递归”错误

    我有一个包含循环引用的对象 我想查看它的 JSON 表示形式 例如 如果我构建这个对象 var myObject member myObject member child myObject member child parent myObj
  • Entity Framework 6 Code First 迁移 - 用于生产的多个分支

    在我的项目中 我们有一个分支模型 它有一个单独的开发分支 并且每个版本都有一个单独的分支 它可能看起来像这样 dev master r1 r2 因此 我们在 dev 上开发并将其合并到 master 然后创建一个发布分支 r1 r2 我们想
  • ng-repeat 插入空锚标记

    我正在尝试使用角度创建一个菜单 菜单项可以有子项 需要另一个 ng repeat 来打印子导航项 当尝试在第二个 ng repeat 中插入锚标记时 我注意到一些奇怪的行为 小提琴链接 http jsfiddle net npU7t htt
  • 有什么有效的方法可以将 XImage 数据转换为像素图(例如 RGB 四边形数组)?

    我正在尝试使用 XGetImage 捕获图像 一切都很好 但我需要将数据发送到需要 RGB 四边形数组的模块 对图像中的每个像素调用 XGetPixel 非常慢 在 i5 上 1440x900 分辨率为 0 5 秒 我在xlib中查找了XG
  • Pyinstaller - 从 os.system 调用 GDAL (gdal_translate)

    问候学识渊博的同学们 在 Windows 7 上运行 32 位 Python2 7 我有一个关于在 pyinstaller 构建中包含 GDAL 可执行文件的问题 我正在进行系统调用来运行 FWTools 版本中的两个 GDAL 函数 这些
  • 请放心,如何在 POST 请求后从响应正文中提取生成的令牌并将其设置到标头

    执行任何请求 我需要执行身份验证POST请求正文 username somename password somepass 标头Content Type application json这给了我一个带有生成令牌的响应 我需要将其粘贴为第二个标
  • 将 Node.js 升级到最新版本

    所以 我安装了 Node js 现在当我尝试安装 Mongoosejs 时 我收到一条错误 告诉我没有所需的 Node js 版本 我有 v0 4 11 需要 v0 4 12 我怎样才能升级到这个版本 我想我只能使用最新版本再次安装它 但在
  • React Native:访问静态函数内的组件状态

    我有一个这样定义的组件 export class A extends Component constructor props this state scene 0 static changeScene scene this setState
  • 对于 2.3.4 上文件路径设置的铃声,MediaPlayer setDataSource 失败,状态 = 0x80000000

    标题说明了大部分内容 我的应用程序一直在播放 uri 指向的铃声 例如content media internal audio media 387 or content media external audio media 1655 我相信
  • 展平可能包含数组的对象数组

    我有一个IEnumerable其中可能包含也可能不包含一些嵌套集合 例如 我的出发点可能是这样的 foo 2 1 2 3 4 bar 我想将其压平为 foo 2 1 2 3 4 bar 我在想一个SelectMany应该在这里工作 但无法找
  • MVC3 RESTful API 路由和 Http 动词处理

    我想为我的 MVC3 应用程序构建 RESTful Json Api 我需要帮助处理多个 Http Verbs 以操作单个对象实例 我读过 研究过 尝试过的内容 MVC 属性 HttpGet HttpPost等 允许我拥有一个具有多个共享相