В previous question я спросил о синхронизации данных с сервером DaviCal. Я пришел к выводу, что в DaviCal появилась ошибка, так как при запросе сервера CalDav с недопустимым токеном синхронизации сервер должен вернуть ошибку, но вместо этого он возвращает весь набор событий на сервере.CalDav sync-token expirey
Итак, я начал искать альтернативный сервер CalDav. Я использую SabreDav. Я следовал их очень удобному учебнику here.
там говорится:
Предостережение
Обратите внимание, что сервер может свободно «забыть» какую-либо синхронизация жетоны, которые были ранее выданной. В этом случае может потребоваться повторная синхронизация.
В случае, если поставляемый синхронизирующий токен не распознается сервером, испускается ошибка HTTP. SabreDAV испускает 403.
Это выглядит многообещающим: именно то, что мне нужно!
Так что я получаю мой токен синхронизации, который равен http://sabre.io/ns/sync/15
.
я тогда представить свой REPORT
запрос следующим образом (может быть, где я делаю вещи неправильно ?!)
string syncToken = "http://sabre.io/ns/sync/15";
string body = " <d:sync-collection xmlns:d=\"DAV:\"> " +
" <d:sync-token>" + syncToken + "</d:sync-token> " +
" <d:sync-level>1</d:sync-level> " +
" <d:prop> " +
" <d:getetag/> " +
" </d:prop> " +
" </d:sync-collection> ";
Request = (HttpWebRequest)HttpWebRequest.Create("http://my.sabredav.com/calendars/example/home/");
Request.Credentials = new NetworkCredential("my_user", "my_pwd");
Request.Method = "REPORT";
Request.ContentType = "application/xml";
// set the body of the request...
Request.ContentLength = body.Length;
using (Stream reqStream = Request.GetRequestStream()) {
// Write the string to the destination as a text file.
byte[] encodedBody = Encoding.UTF8.GetBytes(body);
reqStream.Write(encodedBody, 0, encodedBody.Length);
reqStream.Close();
}
// Send the method request and get the response from the server.
Response = (HttpWebResponse)Request.GetResponse();
Так что, когда я отправить запрос с помощью действительной синхронизации лексема http://sabre.io/ns/sync/15
Я только что получил, я получаю пустой ответ:
<?xml version="1.0"?>
<d:multistatus xmlns:d="DAV:" xmlns:s="http://sabredav.org/ns" xmlns:cal="urn:ietf:params:xml:ns:caldav" xmlns:cs="http://calendarserver.or /ns/">
<d:sync-token>http://sabre.io/ns/sync/15</d:sync-token>
</d:multistatus>
Пока все хорошо.
Если я использую предыдущий синхронизированной маркер, который я знаю, является действительным в какой-то момент (http://sabre.io/ns/sync/14
в этом случае - случайно это предыдущий номер ...) Я получаю изменения, как и ожидалось:
<?xml version="1.0"?>
<d:multistatus xmlns:d="DAV:" xmlns:s="http://sabredav.org/ns" xmlns:cal="urn:ietf:params:xml:ns:caldav" xmlns:cs="http://calendarserver.org/ns/">
<d:response>
<d:href>/calendarserver.php/calendars/admin/default/23b351ee-7677-46e3-b5c5-5263e8fca351.ics</d:href>
<d:propstat>
<d:prop>
<d:getetag>"8d8d122a66625ca990252fae652cd2e5"</d:getetag>
</d:prop>
<d:status>HTTP/1.1 200 OK</d:status>
</d:propstat>
</d:response>
<d:sync-token>http://sabre.io/ns/sync/15</d:sync-token>
</d:multistatus>
Но проблема в том, что если я использую RANDOM маркер синхронизации, что я определенно знаю, никогда не было выдано: http://sabre.io/ns/sync/1234312231344324
я получаю тот же ответ, когда я использовал последнюю версию (текущий) фишку:
<?xml version="1.0"?>
<d:multistatus xmlns:d="DAV:" xmlns:s="http://sabredav.org/ns" xmlns:cal="urn:ietf:params:xml:ns:caldav" xmlns:cs="http://calendarserver.org/ns/">
<d:sync-token>http://sabre.io/ns/sync/15</d:sync-token>
</d:multistatus>
SabreDav говорит, что он должен выбросить ошибку 403, но, очевидно, это не то, что я получаю здесь ... Однако, если я использую формат синхронного токена INVALID, скажем token1234
, я действительно получаю ошибку 403 ...
Итак, вопрос: КАК я могу убедиться, что мой токен синхронизации все еще действителен? Итак, если токен действителен и ничего не возвращается, я знаю, что мой локальный кеш обновлен или, в случае, если токен синхронизации является INVALID, мне нужно выполнить полную синхронизацию!
Сервер не должен иметь дело со случайными токенами, токены полностью непрозрачны для клиента. Кроме того, на сервере не должно быть «to_ expire tokens», оно * может *, это что-то другое ;-) Я бы предположил, что SabreDAV присоединяет постоянно растущий номер ревизии к каждому изменению, и токен sync просто ссылается на это. Конечно, сервер, вероятно, должен удалить надгробия в конечном итоге, но это может быть процесс обслуживания базы данных, выполняющийся независимо. P.S .: вполне вероятно, ошибка SabreDAV. – hnh
Wrt the PS: ошибка, которая не влияет на надлежащего клиента! Кроме того, не делайте такого рода «» + syncToken - всегда правильно кодировать маркеры XML, они вполне могут содержать специальные символы XML. –
hnh