0

我創建了一個ASP.NET MVC4 Web API服務(REST)與單個GET操作。該動作當前需要11個輸入值,因此我不是將所有這些值傳遞到URL中,而是選擇將這些值封裝到一個類類型中,並將其作爲Content-Body傳遞。當我在Fiddler中測試時,我將動詞指定爲GET,並在「請求正文」輸入框中輸入JSON文本。這很好用!ProtocolViolationException負載測試Web服務(與內容體的GET操作)

問題是當我嘗試在Visual Studio 2010 Ultimate中執行負載測試時。我能夠指定GET操作和JSON Content-Body就好了。但是,當我運行Load測試時,VS會報告測試結果中的類型爲ProtocolViolationException的異常(無法使用此謂詞類型發送內容主體)。該測試在1ms內執行,因此我懷疑這些例外會導致測試立即中止。我能做些什麼來避免這些例外情況?我寧願不改變我的API來使用URL參數來解決測試工具。如果我因其他原因更改API,請告訴我。謝謝!

+0

更好地避免使用GET的內容。你爲什麼需要它?你可以使用'POST'動詞。在現實世界中,'GET'不應該需要11個輸入。 – Aliostad 2012-07-20 09:16:16

+0

@Aliostad,我沒有寫任何東西到服務器。我只是根據輸入條件查詢。 GET似乎是正確的。我正在構建真正需要11個以上輸入值的真實世界服務。 ASP.NET Web API支持它就好了。除了我遇到的工具問題之外,選擇POST的_concrete_原因是什麼?任何後果?謝謝! – 2012-07-20 17:05:09

回答

0

我發現放這個答案比較容易,而不是進行討論。

發送內容GET未在RFC 2616中定義,但尚未禁止。所以就規範而言,我們處於一個我們必須作出判斷的領域。

GET是正則用於得到資源。所以你正在使用這個動詞和你正在發送的參數來檢索這個資源。由於GET既安全又冪等,因此非常適合緩存。緩存通常基於資源URI進行 - 有時基於不同的頭文件。關鍵是緩存實現 - AFAIK - 不會使用GET內容(說實話,我還沒有看到任何GET與真實世界的內容)。將內容包含在密鑰生成中是沒有意義的,因爲它會降低高速緩存的可伸縮性。

如果您有要發送的參數,它們必須位於URI中,因爲這是定義該URI的一部分。 因此,我堅信用GET發送內容是錯誤的

即使您查看諸如OData的實現,他們也會將條件放入URI中。我無法想象您的(或任何)應用程序要求超出OData查詢要求。

+0

已售出。感謝你的回答。 – 2012-07-23 16:48:08

+0

Aliostad JSONP呢?我的客戶端在客戶端瀏覽器上使用JavaScript進行調用,因此它需要使用僅通過GET提供的JSONP ...。所以我不得不支持GET。除非有我失蹤的替代解決方案。 (我的API在過去的幾個月裏使用JSONP和GET工作,沒有問題。) – 2013-02-19 20:42:47

+0

@LeeGrissom JSONP不一定是寧靜的。此外,瀏覽器無法使用GET發送內容,因此您必須使用該URL發送查詢字符串參數。 – Aliostad 2013-02-20 10:51:29