2014-08-28 89 views
2

我已經在C#中爲我們銷售的產品定製了一個CalDav服務器,並且所有的工作都非常好用。只有一件事情讓我煩惱,但在標準中我找不到解決我煩惱的問題。CalDav由服務器分配的UID

當客戶端連接到我們的CalDav服務器並創建新的Event時,客戶端會告訴服務器UID對於提交的事件是什麼。我們的服務器將其Event保存在其自己的數據庫中(作爲不同的模型),並且該對象從我們的服務器獲得ID

我回應客戶端,該對象被保存並獲得一個新的位置,這使得客戶端檢索對象的最新版本。

但我很想改變客戶端發送的事件的UID到我們用來查找對象的ID

有沒有辦法告訴客戶「我爲您儲存了物品,但是請檢索此版本,並更改​​UID並轉儲舊版本?」

因爲現在的工作方式是,客戶端確實檢索新創建的事件被髮送給我們(使用PUT請求)之後,但由於新UIDEvent有,客戶認爲這是一個新的目的。

我已經試過這樣做,通過對客戶說他們試圖發佈到/mycaldav/SOME-WEIRD-UID-HERE.ics的項目實際上應該發佈到/mycaldav/MY-OWN-UID.ics

這導致了一個帖子到正確的URL,但錯誤的UID

回答

3

這很簡單:在CalDAV/CardDAV中,UID是由客戶端分配的(也是PUT的URL)。 你不能只是改變它,因爲客戶端可能需要「它的」ID來關聯客戶端的東西(例如附件,調度請求,關聯的聯繫人等)。

摘要:您需要將客戶端分配的UID(和URL)映射到服務器上的內部ID。這很不方便,但它的工作方式。也許只是將其存儲在您用來存儲客戶端的所有X屬性的相同結構中?

+0

謝謝,這就是我們目前正在做的,但我希望通過某種方式強制刷新客戶端項目。但事實上這似乎是不可能的。 – 2014-09-03 05:07:32

+0

觸發刷新的一種慣例是不要在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