2011-05-26 79 views
26

您好我發現的WCF REST的例子一用一WEBINVOKE方法就像下面優勢相比WEBGET

[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就像下方根據我的觀察,我們通過在URI模板中爲WEbGet和WebInvoke POST追加查詢字符串來發送參數,我們可以使用WebInvoke POST獲得哪些優勢,我們可以根據我的觀察發現WEBINVOKE POST和WEBGET之間的差異究竟是什麼沒有得到使用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); 

回答

46

這是非常大的差異。首先REST通常使用這些HTTP動詞:

  • GET - 檢索項目
  • POST - 將項目
  • PUT - 更新項目
  • DELETE - 刪除項目

你不要使用GET來獲取其他東西,然後檢索項目。使用HTTP GET進行數據修改在整個Web開發中被認爲是不好的做法。要觸發GET,您只需要在網頁上創建鏈接或只需輸入瀏覽器的URL即可。你會刷新50次,並有50個相同的插入。數據修改應始終使用POST完成。如果您的表單觸發了HTTP POST(Post不能直接觸發),並且您點擊刷新瀏覽器通常會詢問您是否希望再次提交表單=如果您確實想要再次發佈並處理數據到服務器。

另一個問題是GET請求可以緩存和重定向,但POST請求不能。

+0

很好地解釋了...... – 2012-11-27 06:25:49

+1

除非您正在創建的Web服務需要接受跨域Ajax調用 - 在這種情況下,GET對於數據檢索和修改都是必需的。在跨域AJAX情況下不允許POST。 – 2013-07-05 00:00:06

+0

這是一張完美的圖片! – iamCR 2014-07-04 04:28:51

2

爲了回答你的問題,我建議你理解HTTP協議語義,特別是HTTP動詞,例如GET,POST,PUT,DELETE
HTTP GET完成從任何位置檢索資源,因此請求不應該改變資源的狀態。
HTTP POST用於創建並有時更新內容,因此已用於上面的Insert方法。
如果你運行上面的WCF服務,看看這些請求是如何形成的,服務器你會發現GET沒有body payload,而POST有。在POST的情況下,主體包含需要創建的內容\更新。

5

這個環節應該提供進一步的深入瞭解提供的答案:

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屬性只能用於數據輸入/更新。

+1

不要點擊上面的鏈接。我被重新定向到惡意軟件網站。 – 2017-10-19 23:32:26