我已經在C#中爲我們銷售的產品定製了一個CalDav服務器,並且所有的工作都非常好用。只有一件事情讓我煩惱,但在標準中我找不到解決我煩惱的問題。CalDav由服務器分配的UID
當客戶端連接到我們的CalDav服務器並創建新的Event
時,客戶端會告訴服務器UID
對於提交的事件是什麼。我們的服務器將其Event
保存在其自己的數據庫中(作爲不同的模型),並且該對象從我們的服務器獲得ID
。
我回應客戶端,該對象被保存並獲得一個新的位置,這使得客戶端檢索對象的最新版本。
但我很想改變客戶端發送的事件的UID
到我們用來查找對象的ID
。
有沒有辦法告訴客戶「我爲您儲存了物品,但是請檢索此版本,並更改UID
並轉儲舊版本?」
因爲現在的工作方式是,客戶端確實檢索新創建的事件被髮送給我們(使用PUT
請求)之後,但由於新UID
的Event
有,客戶認爲這是一個新的目的。
我已經試過這樣做,通過對客戶說他們試圖發佈到/mycaldav/SOME-WEIRD-UID-HERE.ics
的項目實際上應該發佈到/mycaldav/MY-OWN-UID.ics
。
這導致了一個帖子到正確的URL,但錯誤的UID
。
謝謝,這就是我們目前正在做的,但我希望通過某種方式強制刷新客戶端項目。但事實上這似乎是不可能的。 – 2014-09-03 05:07:32
觸發刷新的一種慣例是不要在PUT響應中返回一個ETag,但是這對HTTP RFC也是非常有前途的。 Prefer標題也可以返回更改後的內容。這有類似的東西:https://svn.calendarserver.org/repository/calendarserver/CalendarServer/trunk/doc/Extensions/calendarserver-bulk-change.txt(返回改變數據)。但是:即使您可以立即返回新內容,但由於我提到的原因,更改UID仍然是一個非常糟糕的主意。你不能指望客戶調和所有相關的數據。 – hnh 2014-09-04 20:53:19