Getting User's List of Calendars from CalDAV
我正在尝试从CalDAV服务器获取当前用户拥有的日历列表。
我能够通过以下请求使用我们的初始测试帐户获取此信息:
1 2 3 4 | PROPFIND /calendars/users/test/ <propfind xmlns='DAV:'> </propfind> |
结果是带有多个
但是,当我们添加其他用户时,这会产生" Not Found "错误,因此我改用" principal-match "请求来获取当前用户的" calendar-home-set" "路径。
该路径类似于/ d817aaec-7d24-5b38-bc2f-6369da72cdd9 /。因此,我使用此路径尝试了上述请求。现在,结果是一个只有一个
我一生都无法找出神奇的调味料,这将使我在所有情况下都能获得用户日历的列表。
编辑:
这是我的一些代码。我最初尝试的" / calendars / users / test / " URL是从
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | Headers["Depth"] ="1"; //XElement xmlResult = UploadXml(GetRequestAddress(), // Alternatively, CalendarHomeSet method: CalDavMethod.PropertyFind, xml: XDocument.Parse("<propfind xmlns='DAV:'>" + "" + "</propfind>").Root); private string GetRequestAddress(string calendarHRef = null, string resource = null) { string path = calendarHRef; if (String.IsNullOrWhiteSpace(path)) path = String.Format("/calendars/users/{0}/", UserName); if (!String.IsNullOrWhiteSpace(resource)) path = Path.Combine(path, resource); return path; } /// <summary> /// Gets/sets the path to the parent folder of any calendar subfolders /// owned by the current user. /// </summary> public string CalendarHomeSet { get { if (calendarHomeSet == null) { Headers["Depth"] ="0"; XElement xmlResult = UploadXml(String.Format("/principals/users/{0}/", UserName), method:"REPORT", xml: XDocument.Parse(XmlHeader + "<D:principal-match xmlns:D="DAV:">" + "<D:self/>" + "<D:prop>" + "<C:calendar-home-set xmlns:C="urn:ietf:params:xml:ns:caldav"/>" + "</D:prop>" + "</D:principal-match>").Root); // XElement el = xmlResult.Descendants(CalDavXmlns +"calendar-home-set").FirstOrDefault(); if (el != null) { calendarHomeSet = (string)el; if (!calendarHomeSet.EndsWith("/")) calendarHomeSet += '/'; } } return calendarHomeSet; } set { calendarHomeSet = value; } } private string calendarHomeSet = null; |
第二编辑:
以下是有关我的请求和响应的确切内容的更多详细信息。在第一个中,请注意结果包括一个集合,然后是两个日历集合。
1 2 3 4 5 | PROPFIND /calendars/users/test/ <propfind xmlns="DAV:"> </propfind> |
响应:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 | <multistatus xmlns="DAV:"> <response> <href>/calendars/users/test/</href> <propstat> <prop> <getetag>"4293-1000-4FFC9A16"</getetag> <current-user-principal> <href>/principals/__uids__/d817aaec-7d24-5b38-bc2f-6369da72cdd9/</href> </current-user-principal> <displayname>Test User</displayname> <getcontenttype>httpd/unix-directory</getcontenttype> <supportedlock> <lockentry> <lockscope> <exclusive /> </lockscope> <locktype> <write /> </locktype> </lockentry> <lockentry> <lockscope> <shared /> </lockscope> <locktype> <write /> </locktype> </lockentry> </supportedlock> <resourcetype> <collection /> </resourcetype> <getcontentlength /> <getlastmodified>Tue, 10 Jul 2012 21:09:42 GMT</getlastmodified> <creationdate>2012-07-10T21:09:42Z</creationdate> <resource-class xmlns="http://twistedmatrix.com/xml_namespace/dav/">CalendarHomeFile</resource-class> </prop> <status>HTTP/1.1 200 OK</status> </propstat> </response> <response> <href>/calendars/users/test/calendar/</href> <propstat> <prop> <getetag>"42DB-1000-50108ABC"</getetag> <current-user-principal> <href>/principals/__uids__/d817aaec-7d24-5b38-bc2f-6369da72cdd9/</href> </current-user-principal> <calendar-order xmlns="http://apple.com/ns/ical/">1</calendar-order> <displayname>calendar</displayname> <calendar-color xmlns="http://apple.com/ns/ical/">#F64F00FF</calendar-color> <getctag xmlns="http://calendarserver.org/ns/">2012-07-26 00:09:32.361284</getctag> <getcontenttype>httpd/unix-directory</getcontenttype> <supportedlock> <lockentry> <lockscope> <exclusive /> </lockscope> <locktype> <write /> </locktype> </lockentry> <lockentry> <lockscope> <shared /> </lockscope> <locktype> <write /> </locktype> </lockentry> </supportedlock> <resourcetype> <collection /> <calendar xmlns="urn:ietf:params:xml:ns:caldav" /> </resourcetype> <getcontentlength /> <schedule-calendar-transp xmlns="urn:ietf:params:xml:ns:caldav"> <opaque /> </schedule-calendar-transp> <getlastmodified>Thu, 26 Jul 2012 00:09:32 GMT</getlastmodified> <creationdate>2012-07-26T00:09:32Z</creationdate> <resource-class xmlns="http://twistedmatrix.com/xml_namespace/dav/">CalDAVFile</resource-class> </prop> <status>HTTP/1.1 200 OK</status> </propstat> </response> <response> <href>/calendars/users/test/8C1F393E-04E8-428A-819A-933C3A9338AD/</href> <propstat> <prop> <getetag>"43AA-1000-50079D1C"</getetag> <current-user-principal> <href>/principals/__uids__/d817aaec-7d24-5b38-bc2f-6369da72cdd9/</href> </current-user-principal> <calendar-order xmlns="http://apple.com/ns/ical/">0</calendar-order> <displayname>Jon Wood Calendar</displayname> <calendar-color xmlns="http://apple.com/ns/ical/">#711a76</calendar-color> <getctag xmlns="http://calendarserver.org/ns/">2012-07-19 05:37:32.673835</getctag> <getcontenttype>httpd/unix-directory</getcontenttype> <supportedlock> <lockentry> <lockscope> <exclusive /> </lockscope> <locktype> <write /> </locktype> </lockentry> <lockentry> <lockscope> <shared /> </lockscope> <locktype> <write /> </locktype> </lockentry> </supportedlock> <resourcetype> <collection /> <calendar xmlns="urn:ietf:params:xml:ns:caldav" /> </resourcetype> <getcontentlength /> <schedule-calendar-transp xmlns="urn:ietf:params:xml:ns:caldav"> <transparent /> </schedule-calendar-transp> <getlastmodified>Thu, 19 Jul 2012 05:37:32 GMT</getlastmodified> <creationdate>2012-07-19T05:37:32Z</creationdate> <resource-class xmlns="http://twistedmatrix.com/xml_namespace/dav/">CalDAVFile</resource-class> </prop> <status>HTTP/1.1 200 OK</status> </propstat> </response> <response> <href>/calendars/users/test/outbox/</href> <propstat> <prop> <getetag>"D4E-1000-4FFB15AF"</getetag> <current-user-principal> <href>/principals/__uids__/d817aaec-7d24-5b38-bc2f-6369da72cdd9/</href> </current-user-principal> <displayname>outbox</displayname> <getctag xmlns="http://calendarserver.org/ns/">2012-07-09 17:32:31.950308</getctag> <getcontenttype>httpd/unix-directory</getcontenttype> <supportedlock> <lockentry> <lockscope> <exclusive /> </lockscope> <locktype> <write /> </locktype> </lockentry> <lockentry> <lockscope> <shared /> </lockscope> <locktype> <write /> </locktype> </lockentry> </supportedlock> <resourcetype> <collection /> <schedule-outbox xmlns="urn:ietf:params:xml:ns:caldav" /> </resourcetype> <getcontentlength /> <getlastmodified>Mon, 09 Jul 2012 17:32:31 GMT</getlastmodified> <creationdate>2012-07-09T17:32:31Z</creationdate> <resource-class xmlns="http://twistedmatrix.com/xml_namespace/dav/">ScheduleOutboxFile</resource-class> </prop> <status>HTTP/1.1 200 OK</status> </propstat> </response> <response> <href>/calendars/users/test/freebusy</href> <propstat> <prop> <getetag>"D7D-0-4FFC3F7C"</getetag> <current-user-principal> <href>/principals/__uids__/d817aaec-7d24-5b38-bc2f-6369da72cdd9/</href> </current-user-principal> <displayname>freebusy</displayname> <getcontenttype>text/plain</getcontenttype> <supportedlock> <lockentry> <lockscope> <exclusive /> </lockscope> <locktype> <write /> </locktype> </lockentry> <lockentry> <lockscope> <shared /> </lockscope> <locktype> <write /> </locktype> </lockentry> </supportedlock> <resourcetype> <free-busy-url xmlns="http://calendarserver.org/ns/" /> </resourcetype> <getcontentlength>0</getcontentlength> <getlastmodified>Tue, 10 Jul 2012 14:43:08 GMT</getlastmodified> <creationdate>2012-07-10T14:43:08Z</creationdate> <resource-class xmlns="http://twistedmatrix.com/xml_namespace/dav/">FreeBusyURLFile</resource-class> </prop> <status>HTTP/1.1 200 OK</status> </propstat> </response> <response> <href>/calendars/users/test/inbox/</href> <propstat> <prop> <getetag>"42FB-1000-4FF21C60"</getetag> <current-user-principal> <href>/principals/__uids__/d817aaec-7d24-5b38-bc2f-6369da72cdd9/</href> </current-user-principal> <displayname>inbox</displayname> <getctag xmlns="http://calendarserver.org/ns/">2012-07-02 22:10:40.527683</getctag> <getcontenttype>httpd/unix-directory</getcontenttype> <supportedlock> <lockentry> <lockscope> <exclusive /> </lockscope> <locktype> <write /> </locktype> </lockentry> <lockentry> <lockscope> <shared /> </lockscope> <locktype> <write /> </locktype> </lockentry> </supportedlock> <resourcetype> <collection /> <schedule-inbox xmlns="urn:ietf:params:xml:ns:caldav" /> </resourcetype> <getcontentlength /> <schedule-default-calendar-URL xmlns="urn:ietf:params:xml:ns:caldav"> <href xmlns="DAV:">/calendars/__uids__/d817aaec-7d24-5b38-bc2f-6369da72cdd9/calendar</href> </schedule-default-calendar-URL> <getlastmodified>Mon, 02 Jul 2012 22:10:40 GMT</getlastmodified> <creationdate>2012-07-02T22:10:40Z</creationdate> <resource-class xmlns="http://twistedmatrix.com/xml_namespace/dav/">ScheduleInboxFile</resource-class> </prop> <status>HTTP/1.1 200 OK</status> </propstat> </response> </multistatus> |
接下来,我尝试了相同的请求,只是针对不同的URL。这次,我使用了通过查询主体获得的URL。现在结果仍然包含该初始集合,但不包含日历。
1 2 3 4 5 | PROPFIND /calendars/__uids__/d817aaec-7d24-5b38-bc2f-6369da72cdd9/ (CalendarHomeSet) <propfind xmlns="DAV:"> </propfind> |
响应:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | <multistatus xmlns="DAV:"> <response> <href>/calendars/__uids__/d817aaec-7d24-5b38-bc2f-6369da72cdd9/</href> <propstat> <prop> <getetag>"4293-1000-4FFC9A16"</getetag> <current-user-principal> <href>/principals/__uids__/d817aaec-7d24-5b38-bc2f-6369da72cdd9/</href> </current-user-principal> <displayname>Test User</displayname> <getcontenttype>httpd/unix-directory</getcontenttype> <supportedlock> <lockentry> <lockscope> <exclusive /> </lockscope> <locktype> <write /> </locktype> </lockentry> <lockentry> <lockscope> <shared /> </lockscope> <locktype> <write /> </locktype> </lockentry> </supportedlock> <resourcetype> <collection /> </resourcetype> <getcontentlength /> <getlastmodified>Tue, 10 Jul 2012 21:09:42 GMT</getlastmodified> <creationdate>2012-07-10T21:09:42Z</creationdate> <resource-class xmlns="http://twistedmatrix.com/xml_namespace/dav/">CalendarHomeFile</resource-class> </prop> <status>HTTP/1.1 200 OK</status> </propstat> </response> </multistatus> |
第三编辑:
这是我用来获取日历首页设置的请求和响应:
1 2 3 4 5 6 7 8 | REPORT /principals/users/test/ <D:principal-match xmlns:D="DAV:"> <D:self /> <D:prop> <C:calendar-home-set xmlns:C="urn:ietf:params:xml:ns:caldav" /> </D:prop> </D:principal-match> |
响应:
1 2 3 4 5 6 7 8 9 10 11 12 13 | <multistatus xmlns="DAV:"> <response> <href>/principals/users/test/</href> <propstat> <prop> <calendar-home-set xmlns="urn:ietf:params:xml:ns:caldav"> <href xmlns="DAV:">/calendars/__uids__/d817aaec-7d24-5b38-bc2f-6369da72cdd9</href> </calendar-home-set> </prop> <status>HTTP/1.1 200 OK</status> </propstat> </response> </multistatus> |
我现在能想到的两件事:
如果这些指针没有帮助,则应显示完整的请求和响应。
编辑
这通常是在CalDAV中进行发现的方式。
我有一种感觉,因为您进行了主体匹配,并且不使用current-user-principal;这有点不对劲。但是我不我的直觉是,您检测到的日历居家设置是错误的。