【问题标题】:Using Asp.net MVC web.api why should I redirect rather than just call other functions?使用 Asp.net MVC web.api 为什么我应该重定向而不是仅仅调用其他函数?
【发布时间】:2014-09-25 01:52:09
【问题描述】:

我在控制器中有一个 put 和 post 方法,当它们工作时,它们通常会重定向到 get 方法。但我注意到在 MVC 中使用重定向过程比只返回 get 方法的调用要慢。

MS 代码示例:

return RedirectToRoute("someRoute", routeVarWithId);

我发现花费更少的时间:

return Get(Id);

由于我的 put、post 和 get 都返回 IHttpActonResult,如果调用在我的一个控制器内并且安全权限相同,我不明白为什么要使用重定向。

我在这里遗漏了什么明显的东西吗?

【问题讨论】:

标签: c# asp.net-mvc-4 asp.net-web-api asp.net-web-api-routing


【解决方案1】:

但我注意到在 MVC 中使用重定向过程比仅返回 get 方法的调用要慢。

当然是;现在有两个请求。

我在这里遗漏了什么明显的东西吗?

想象一下,我以POST 的形式提交了一份表格,要求从您的网站订购一台新计算机。它没有将重定向返回到我的订单页面,而是将其呈现出来。然后我的猫跳到键盘上并点击CTRL+R(刷新)。发生什么了?我的浏览器重新提交了最后一个请求,即POST。现在我已经订购了两台电脑!

相反,在成功处理POST 请求后,您应该返回一个重定向到订单页面,我的浏览器将使用GET 获取该页面。现在我可以重拾内心的满足了,不会有什么不好的事情发生。

这也使用户能够为页面添加书签或通过电子邮件将其发送给我的妻子。您不能通过电子邮件发送 POST 请求的链接。

有关该主题的一些简单阅读,请参阅HTTP/1.1 standard,特别是第 9.5 节及以下内容:

如果在源服务器上创建了资源,则响应 应该是 201(已创建)并包含一个描述 请求的状态并引用新资源,以及位置 标题(参见第 14.30 节)。

因此,当POST 创建新资源(如订单)时,它应该返回201 Created 重定向到可以检索新资源(即订单)的 URL。

【讨论】:

  • 因此,当多次刷新可能发生“坏事”时,我应该使用重定向,如果我不在乎,那么我可以直接调用。 *** 由于这些是 Web API 调用,我已尝试测试刷新问题,但我似乎没有遇到重复发帖的问题。
  • 是的,如果您使用 API,则该模式的相关性稍差。但对于您的 API 用户所期望的 REST 服务来说,这是一种足够常见的模式。但是,如果您是唯一的客户,您可以做我们为您提供的最简单的操作。
  • 我可能会补充一点,从哲学的角度来看,创建资源和查看资源的详细信息是两件不同的事情,因此在不同的请求中是两个不同的 HTTP 动词。
  • 我正试图减少我的应用程序的每一毫秒。由于我已经用最优化的存储过程(和函数)替换了我的所有 SQL 调用,因此索引是可靠的,并且已经完成了我所有的其他代码缩减,所以我要解决这个问题并删除 Ioc Di。由于我拒绝删除 Ioc Di,保留灵活性和单元测试,我决定这样做。甚至不是代码运行缓慢,而是我一直想挑战自己,以尽可能快地编写代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-09
  • 1970-01-01
  • 2016-05-23
  • 1970-01-01
相关资源
最近更新 更多