gpt4 book ai didi

c# - 从 CalDAV 获取用户的日历列表

转载 作者:行者123 更新时间:2023-11-30 16:23:22 30 4
gpt4 key购买 nike

我正在尝试从 CalDAV 服务器获取当前用户拥有的日历列表。

我能够通过以下请求使用我们的初始测试帐户获取此信息:

PROPFIND /calendars/users/test/
<propfind xmlns='DAV:'>
<allprop/>
</propfind>

结果是 <multistatus>有几个元素<response>元素。如果我提取 resourcetype 所在的元素是日历,我得到我的日历列表。

但是,当我们添加其他用户时,会产生“未找到”错误,因此我改为使用“principal-match”请求来获取当前用户的“calendar-home-set”路径。

该路径类似于/d817aaec-7d24-5b38-bc2f-6369da72cdd9/。所以我用这个路径尝试了上面的请求。现在结果是 <multistatus>只有一个 <response> 的元素元素。它不包含任何日历。第一个响应与我最初请求中的第一个响应完全一样。

我这辈子都想不出在所有情况下都能让我获得日历用户列表的神奇方法。

编辑:

这是我的一些代码。我最初尝试的“/calendars/users/test/”URL 是从 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>

最佳答案

我现在能想到的两件事:

  1. 您是否指定了深度:1 header ?
  2. 新用户真的有日历吗?对于新用户,该列表可能只是空的。

如果这些指示没有帮助,您应该显示完整的请求和响应。

编辑

这就是您通常应该在 CalDAV 中进行发现的方式。

  1. 对用户提供的 URL 执行 PROPFIND,请求 {DAV:}current-user-principal .
  2. 使用此 url,您可以执行 PROPFIND 以查找有关用户的更多信息。在这里,您通常应该在 caldav 命名空间中请求 calendar-home-set 属性。
  3. 然后,使用 calendar-home-set,执行 PROPFIND(深度:1)以查找日历。

我有一种感觉,因为你做的是principal-match,并没有使用current-user-principal;这有点不对劲。但我不完全确定。我的预感很简单,您检测到的 calendar-home-set 是错误的。

关于c# - 从 CalDAV 获取用户的日历列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11622447/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com