代码之家  ›  专栏  ›  技术社区  ›  Robert Koritnik

ASP.NET MVC有什么好休息的?

  •  50
  • Robert Koritnik  · 技术社区  · 14 年前

    在过去的几年里,REST一直是一个很流行的流行词,当ASP.NET MVC推出时,每个人都将REST与ASP.NET MVC联系起来。我也沉迷于嗡嗡声中,由于缺乏知识,我对休息的理解只是:

    rest=seo/用户友好的URL

    但这还不止这些。而且我对REST了解得越多,我就越不会把ASP.NET MVC与它联系起来。当然,它比网络表单更接近于休息。所以事实恰恰相反:

    REST SEO/用户友好的URL

    将默认路由定义为 controller/action/id 一定地 没有休息。

    让我用这种理解来解释我的问题。

    如果ASP.NET MVC是RESTful,我们将不会将默认路由定义为:

    controller/action/id
    

    但更确切地说

    resources/id  /* that would have to use HTTP methods GET/PUT/POST/DELETE */
    

    因此,不用(也为HTTP方法提供请求路径):

    /product/index/1  /* GET */
    /product/create   /* POST */
    /product/delete/1 /* POST */
    /product/update/1 /* POST */
    

    应该是(这里也提供了HTTP方法)

    /products/1  /* GET */
    /products    /* POST */
    /products/1  /* DELETE */
    /products/1  /* PUT */
    

    现在这将是一个休息。 好的是这实际上是可能的。如果你能让它完全休息,这也意味着你会 必须使用Ajax 因为Put和Delete方法不能只使用浏览器请求完成(这不是完全正确的 )因此,现代的Ajax应用程序实际上可以完全恢复。

    Ajax是客户端技术,与ASP.NET MVC没有任何关系。事实上,ASP.NET MVC可以作为一个完全RESTful的应用程序来完成。实现它的方法(Ajax)并不重要。(多亏了达林·迪米特洛夫)

    主要问题

    为什么我们认为ASP.NET MVC是一个RESTful框架,特别是它的URL路由与之相关? 为什么不定义默认的URL路由到 执行 宁静?我不是在寻找有争议的答案,而是那些真正回答这个问题的答案——这种关系是如何产生的……也许我仍然不够聪明,仍然认为这是我对两者都缺乏了解。

    更新的信息

    实际上,您不必使用Ajax来实现完全的RESTful体系结构。ASP.NET MVC支持(自版本2以来)HTTP方法重写,这意味着您可以使用浏览器表单发出Put或Delete方法。您只需添加一个额外的隐藏字段,如:

    <input type="hidden" name="X-HTTP-Method-Override" value="DELETE" />
    

    ASP.NET MVC框架将能够理解像删除请求这样的发布请求,并且 HttpDeleteAttribute 操作方法选择器也将其理解为一个删除请求。重写ftw的HTTP方法!

    7 回复  |  直到 10 年前
        1
  •  26
  •   Martin    14 年前

    没有什么能阻止你走这样的路 resource/id 在ASP.NET MVC中使用http方法get/put/post/delete。这不是默认的路由设置,但您可以这样做。

    编辑(mlaritz-添加darin的评论): ASP.NET MVC是一种服务器端技术,允许您公开RESTful URL。他们的消费方式并不重要。您问过为什么ASP.NET MVC被认为是RESTful技术,答案是因为您可以轻松地公开RESTful URL以供使用,就这么简单。

        2
  •  15
  •   Wyatt Barnett    14 年前

    我认为,很多讨论都与MVC之前.NET Web堆栈的不可恢复性以及MVC在.NET平台上构建RESTful应用程序比ASP.NET MVC具有的任何特别的可恢复性功能都要容易得多有关。

        3
  •  12
  •   pc1oad1etter    14 年前

    没有使API具有RESTful的URI样式。

    您问,“为什么我们将ASP.NET MVC视为一个RESTful框架,特别是将其URL路由与之关联?”

    因为其他人被误解是关于URL而不是关于 resources, a standard interface, and hypermedia .

        4
  •  5
  •   AxelEckenberger    14 年前

    This link 可能会启发你寻找…简言之,您可以使用您描述的URL——至少使用MVC 2。

        5
  •  3
  •   Muhammad Alkarouri    14 年前

    我只是想为剩下的关于Put和Delete的使用的讨论做贡献。

    一般来说,在REST和其他RESTful框架中,put和delete的问题不是通过创建URL来解决的,例如 resource/create resource/delete 。相反,动词是通过post被挖掘出来的:

    1. 传递HTML表单中的隐藏输入,如 _method .
    2. 使用javascript进行放置或删除
    3. 要克服某些防火墙,您可能需要使用HTTP X-HTTP-Method-Override 标题。

    这是HTTP方法问题的一般解决方案。

    我没有得到有关ASP.NET的信息来说明他们为什么不这样做,而是一个URL,例如 /product/delete/1 不提供可休息的资源。

    编辑 :有必要澄清一下什么是休息。 From the horse's mouth :

    除了填写或修复未指定的标准协议位(如https修补方法或链接头字段)的详细信息外,RESTAPI不应包含对通信协议的任何更改。故障实现的解决方法( 比如那些愚蠢到相信HTML定义了https方法集的浏览器 )应该单独定义,或者至少在附录中定义,以期望解决方案最终会过时。[此处的失败意味着资源接口是特定于对象的,而不是一般的。]

    强调我的。REST未定义为使用四个HTTP方法。它甚至没有定义为使用HTTP。它需要一个能够跟踪超链接的通信协议。它使用那个协议,在不违反协议的情况下添加适当的定义。

    对于HTTP,使用不实现Put和Delete的浏览器的解决方法 是显式允许的 。第1点中的rails方法显然做到了这一点。

        6
  •  2
  •   Josh Gallagher Red Romanov    10 年前

    这个问题有点过时了,现在的答案(2014-08)是:ASP.NET MVC允许RESTful URL方案,但其设计并不是默认的。相反,ASP.NET MVC的成功之坑是MVC更传统的控制器+操作风格。

    现在编写RESTful服务的ASP.NET方法是ASP.NET Web API。这使得通过使用与HTTP动词匹配的方法命名约定来创建RESTful URL方案更加容易。

    请注意,一旦当前称为ASP.NET VNext的问题解决后,这个答案就过时了,在这个问题中,Web API和MVC被整合为一个整体。

        7
  •  1
  •   Robert Koritnik    11 年前

    项目经理:“让我们充分休息地开发我们的新项目吧!!

    其他程序员大喊:“是啊,是啊!!

    1. 几周后在开发阶段:“先生,我们需要让客户机能够同时更新多行,因此我们需要做一个变通方案。”

    2. 先生,我只需要最新的发票

    3. “先生,我必须传递传呼号码和大小!”

    真倒霉。为什么我们不都回到XML RPC