在上一个问题中,我询问了与 DaviCal 服务器同步数据的问题。我最终得出的结论是 DaviCal 存在一个错误,因为当使用无效的同步令牌查询 CalDav 服务器时,服务器应该返回一个错误,但相反,它会返回服务器上的整个事件集。
所以我开始寻找替代的 CalDav 服务器。我使用 SabreDav。我在这里遵循了他们非常方便的教程。
上面写着:
注意事项
请注意,服务器可以自由地“忘记”之前发布的任何同步令牌。在这种情况下,可能需要再次进行完全同步。
如果服务器无法识别提供的同步令牌,则会发出 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,但很明显,这不是我在这里得到的……但是,如果我使用无效的同步令牌格式,比如说token1234
,我确实收到错误 403……
所以问题是:如何确保我的同步令牌仍然有效?所以,如果令牌有效并且没有返回任何内容,我知道我的本地缓存是最新的,或者,如果同步令牌无效,我需要进行完全同步!