【问题标题】:Advantages of WebInvoke POST compared to WEBGET与 WEBGET 相比,WebInvoke POST 的优势
【发布时间】:2011-09-02 10:32:54
【问题描述】:

嗨,我找到了一个带有 WEBINVOKE 方法的 wcf REST 示例,如下所示

[OperationContract]
[WebInvoke(
BodyStyle=WebMessageBodyStyle.Bare,
Method="POST",
RequestFormat=WebMessageFormat.Xml,
ResponseFormat=WebMessageFormat.Xml,
UriTemplate="CreateStudent/{StudentName}/{Chair}/{AverageNote}")]
int Insert(string StudentName, string Chair, string AverageNote);


[OperationContract]
[WebGet(
BodyStyle= WebMessageBodyStyle.Bare,
RequestFormat = WebMessageFormat.Xml,
ResponseFormat = WebMessageFormat.Xml)]
Student[] GetAllStudents();

我的问题是我可以像下面那样使用 WEBGET 方法而不是 WEBINVOKE,WEBINVOKE POST 和 WEBGET 之间到底有什么区别, 根据我的观察,我们通过在 URI 模板中为 WEBGet 和 WebInvoke POST 附加查询字符串来发送参数,使用 WebInvoke POST 可以获得哪些使用 WEBGET 无法获得的优势

[OperationContract]
[WebGet(
BodyStyle=WebMessageBodyStyle.Bare, 
RequestFormat=WebMessageFormat.Xml,
ResponseFormat=WebMessageFormat.Xml,
UriTemplate="CreateStudent/{StudentName}/{Chair}/{AverageNote}")]
int Insert(string StudentName, string Chair, string AverageNote);

【问题讨论】:

    标签: wcf rest


    【解决方案1】:

    此链接应提供对所提供答案的进一步了解:

    http://blog.markkoltnuk.com/2011/02/14/understanding-wcf-webinvokewebget-attributes/

    让我们一劳永逸地解释一下 WebInvoke 和 WebGet 之间的区别。

    WebGet(常用于检索数据)

    WebGet 属性使用 GET 动词公开操作。您可以通过在地址栏中键入服务的 URI 来直接通过 Web 浏览器访问端点。参数可以作为查询字符串参数在 URI 中发送,也可以嵌入在 URI 中。由于其缓存功能,WebGet 属性应仅用于数据检索。

    WebInvoke(常用于数据输入/更新) WebInvoke 属性使用其他 HTTP 动词(例如 POST、PUT 和 DELETE)公开服务。 POST 是默认值,但可以通过设置属性的 Method 属性来更改它。 WebInvoke 属性应仅用于数据输入/更新。

    【讨论】:

    • 不要点击上面的链接。我被重定向到恶意软件站点。
    【解决方案2】:

    要回答您的问题,我建议您了解 HTTP 协议语义,尤其是 HTTP 动词,例如 GET、POST、PUT、DELETE
    HTTP GET 用于从任何位置检索资源,因此请求不应更改资源的状态。
    HTTP POST 用于创建和有时更新内容,因此已在上面的 Insert 方法中使用。
    如果您运行上面的 WCF 服务并查看这些请求是如何形成的以及服务器是如何形成的,您会发现 GET 没有正文有效负载,而 POST 有。在 POST 的情况下,正文包含需要创建\更新的内容。

    【讨论】:

      【解决方案3】:

      差别很大。首先,REST 通常与这些 HTTP 动词一起使用:

      • GET - 检索项目
      • POST - 插入项目
      • PUT - 更新项目
      • DELETE - 删除项目

      您不应该将 GET 用于检索项目之后的任何其他事情。在整个 Web 开发中,使用 HTTP GET 进行数据修改被认为是一种不好的做法。要触发 GET,您只需在网页上创建链接或只需键入浏览器的 URL。您将刷新 50 次,并且您有 50 个相同的插入。数据修改应始终使用 POST 完成。如果您有触发 HTTP POST 的表单(无法直接触发 Post)并且您点击刷新浏览器通常会询问您是否要再次提交表单 = 如果您真的想再次将数据发布并处理到服务器。

      另一个问题是GET请求可以被缓存和重定向,而POST请求不能。

      【讨论】:

      • 除非您创建的 Web 服务需要接受跨域 ajax 调用——在这种情况下,数据检索和修改都需要 GET。跨域 ajax 情况下不允许 POST。
      • Ladislav,你知道为什么要专门使用 WebInvoke(Method=Get..) 而不是 WebGet(),反之亦然吗?
      • 如果 GET 方法有参数怎么办?必须在 WebGet 或 WebInvoke 中?
      猜你喜欢
      • 1970-01-01
      • 2012-04-05
      • 2010-12-26
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      • 2013-09-22
      • 2012-05-17
      • 2016-07-04
      相关资源
      最近更新 更多