与WEBGET相比,WebInvoke POST的优点

时间:2011-05-26 09:21:33

标签: wcf rest

您好我发现了一个带有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之间究竟有什么区别, 根据我的观察,我们通过在WESLGet和WebInvoke POST的URI模板中附加查询字符串来发送参数,使用WEBGET我们无法获得的WebInvoke POST有什么好处

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

3 个答案:

答案 0 :(得分:48)

这是非常大的区别。首先,REST通常与这些HTTP谓词一起使用:

  • 获取 - 检索项目
  • POST - 插入项目
  • PUT - 更新项目
  • 删除 - 删除项目

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

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

答案 1 :(得分:5)

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

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

让我们一劳永逸地解释一下WebInvoke& amp; WebGet。

WebGet(通常用于检索数据)

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

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

答案 2 :(得分:2)

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