2009-02-21 30 views
5

我正在尋找使用ASP.Net MVC作爲基於REST的服務的平臺。我知道WCF已經構建了對REST服務的支持;但是,我正在尋找根據請求返回多種類型的數據。使用asp.net mvc爲基於REST的端點

我希望客戶端請求內容類型。所以,如果他們發送文本/ HTML例如我會將我的模型呈現爲Html,如果他們請求text/xml它將返回XML。我們也可以做JSON。

有沒有人看到這個問題?

不使用WCF可能會增加客戶端在調用服務時的複雜性,因爲它們將無法自動生成代理;然而,就我而言,客戶端將是瀏覽器請求的html或處理xml的java客戶端庫。

由於沒有使用WCF我們需要保護服務;不過,我想我們可以使用表單身份驗證來做到這一點。

這樣做的好處是,不管是什麼類型的客戶端請求它通過相同的控制器/模型等一切會數據...

回答

2

閱讀哈克的帖子後,關於使用擴展名來表示內容類型,我認爲你最好關閉Accept Header。對我來說似乎更多Rest'ish,雖然授予它更難以啓動瀏覽器和測試您的網址。

我通過一個關於這樣做的小博客文章,並使用ModelBinder從控制器中抽象出HttpContext:http://jberke.blogspot.com/2009/03/aspnet-mvc-model-binder.html

此外,爲了響應特洛伊的選擇性評論,我使用視圖呈現了我的模型的Xml。這讓我對同一個模型有不同的xml格式。這是有道理的。如果您需要支持版本控制或針對不同客戶端的不同格式,該怎麼辦?我不喜歡框架自動渲染任何東西的想法。

2

你可能想看看這個博客帖子和從菲爾哈克下面的討論:

http://haacked.com/archive/2009/01/06/handling-formats-based-on-url-extension.aspx

他的代碼使用要求的文件擴展名(html的,以.json,.XML)來確定輸出,但是你可以很容易地使用的Accept-Encoding(或都)。

注意:我在Phil的帖子上留言評論,仍然強烈要求應該採取行動來「選擇」他們所支持的渲染方法。通過HTML渲染,您可以控制向最終用戶顯示多少view數據。無論您是否打算將其公開顯示,XML/JSON呈現都可能會呈現您傳遞給viewdata的所有內容。

3

哈克的解決方案當然不是最好的解決方法,儘管這是一個很好的起點。對於初學者來說,如果您正在使用實體框架(或者決定在以後的日期從Linq切換到SQL),那麼JsonResult將因爲無法使用循環引用(通常是大多數數據模型)序列化對象圖而中斷。其次,它爲同一資源公開多個端點。

執行此操作的正確方法是查看X-Requested-With HTTP標頭以確定這是否是XHR請求。或者Content-Type: text/xml XML請求標頭。

我建議您安裝模擬XHR請求的REST testing的Firefox插件。 Tamper Data插件和其他一些插件允許對測試/調試進行更好的控制。 WFetch是一個直接的原始HTTP請求工具,對於測試和調試也很重要。

我寫了JSON/POX action filter這樣做。您只需用[JsonPox]屬性修飾您的類或方法,並且它們將根據客戶端自動顯示爲JSON或XML。

+0

我一直在使用內容類型來指示用戶是否希望Xml或Html(今天我實際上只支持Xml)。我打算讓我的控制器選擇一個Html或Xml視圖,然後負責將模型轉換爲結果。我認爲這很好。感謝您的反饋和附加信息。 – JoshBerke 2009-05-11 13:18:34