Я пытаюсь получить список календарей текущего пользователя с сервера CalDAV.
Мне удалось получить эту информацию, используя нашу первоначальную тестовую учетную запись со следующим запросом:
PROPFIND /calendars/users/test/
<propfind xmlns='DAV:'>
<allprop/>
</propfind>
Результатом является элемент <multistatus>
с несколькими элементами <response>
. Если я извлеку элементы, где resourcetype
— это календарь, я получу свой список календарей.
Однако, когда мы добавили дополнительных пользователей, это привело к ошибке «Не найдено», поэтому вместо этого я использовал запрос «основного совпадения», чтобы получить путь «календарь-домашняя установка» текущего пользователя.
Этот путь выглядит как /d817aaec-7d24-5b38-bc2f-6369da72cdd9/. Итак, я попробовал вышеуказанный запрос с этим путем. Теперь результатом является элемент <multistatus>
только с одним элементом <response>
. Он не содержит календарей. Первый ответ точно такой же, как и первый ответ в моем первоначальном запросе.
Я не могу на всю жизнь придумать волшебный соус, который позволил бы мне получить список календарей пользователей во всех случаях.
ИЗМЕНИТЬ:
Вот часть моего кода. URL-адрес «/calendars/users/test/», который я пробовал изначально, возвращается из GetRequestAddress()
. Мой второй случай, когда я использовал principal-match
, чтобы получить путь календаря, используемый CalendarHomeSet
(оба показаны ниже).
Headers["Depth"] = "1";
//XElement xmlResult = UploadXml(GetRequestAddress(), // Alternatively, CalendarHomeSet
method: CalDavMethod.PropertyFind,
xml: XDocument.Parse("<propfind xmlns='DAV:'>" +
"<allprop/>" +
"</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;
ВТОРОЕ ИЗМЕНЕНИЕ:
Вот еще некоторые подробности о точном содержании моих запросов и ответов. Обратите внимание, что в первом случае результаты включают коллекцию, за которой следуют две коллекции календарей.
PROPFIND /calendars/users/test/
<propfind xmlns="DAV:">
<allprop />
</propfind>
Ответ:
<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-адрес, полученный путем запроса принципала. Теперь результаты по-прежнему содержат исходную коллекцию, но не содержат календарей.
PROPFIND /calendars/__uids__/d817aaec-7d24-5b38-bc2f-6369da72cdd9/ (CalendarHomeSet)
<propfind xmlns="DAV:">
<allprop />
</propfind>
Ответ:
<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>
ТРЕТЬЕ ИЗМЕНЕНИЕ:
А вот запрос и ответ, которые я использовал, чтобы получить домашний набор календаря:
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>
Ответ:
<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>