我们在Exchange 2007公共文件夹中设置了公司的公共日历。我可以使用下面的代码检索当前日期的个人日历约会。我在网上搜索了很多,但找不到有人从公共文件夹日历中检索日历信息的例子。
这似乎是可行的,但我无法让它正常工作。我该如何修改下面的代码来访问日历?我不想通过asp.net创建任何约会,只想检索一个简单的列表。我也愿意接受任何其他建议。谢谢。
*添加赏金* - 我不可能是唯一需要这样做的人。让我们为未来的世代解决这个问题。
*由于无知而更新* - 我忘了提到我正在处理.NET 2.0项目(非常重要,你认为呢?)。
*添加我的代码解决方案* - 我已经用最终起作用的代码替换了原始代码示例。非常感谢Oleg提供了查找公共文件夹的代码,这是最困难的部分。我使用了这里的示例 http://msexchangeteam.com/archive/2009/04/21/451126.aspx 来使用更简单的FindAppointments方法修改了代码。
这个简单的示例返回一个HTML字符串,其中包含约会信息,但您可以将其用作自定义的基础。您可以在他下面的答案下看到我们的来回交流。
这似乎是可行的,但我无法让它正常工作。我该如何修改下面的代码来访问日历?我不想通过asp.net创建任何约会,只想检索一个简单的列表。我也愿意接受任何其他建议。谢谢。
*添加赏金* - 我不可能是唯一需要这样做的人。让我们为未来的世代解决这个问题。
*由于无知而更新* - 我忘了提到我正在处理.NET 2.0项目(非常重要,你认为呢?)。
*添加我的代码解决方案* - 我已经用最终起作用的代码替换了原始代码示例。非常感谢Oleg提供了查找公共文件夹的代码,这是最困难的部分。我使用了这里的示例 http://msexchangeteam.com/archive/2009/04/21/451126.aspx 来使用更简单的FindAppointments方法修改了代码。
这个简单的示例返回一个HTML字符串,其中包含约会信息,但您可以将其用作自定义的基础。您可以在他下面的答案下看到我们的来回交流。
using System;
using Microsoft.Exchange.WebServices.Data;
using System.Net;
namespace ExchangePublicFolders
{
public class Program
{
public static FolderId FindPublicFolder(ExchangeService myService, FolderId baseFolderId,
string folderName)
{
FolderView folderView = new FolderView(10, 0);
folderView.OffsetBasePoint = OffsetBasePoint.Beginning;
folderView.PropertySet = new PropertySet(FolderSchema.DisplayName, FolderSchema.Id);
FindFoldersResults folderResults;
do
{
folderResults = myService.FindFolders(baseFolderId, folderView);
foreach (Folder folder in folderResults)
if (String.Compare(folder.DisplayName, folderName, StringComparison.OrdinalIgnoreCase) == 0)
return folder.Id;
if (folderResults.NextPageOffset.HasValue)
folderView.Offset = folderResults.NextPageOffset.Value;
}
while (folderResults.MoreAvailable);
return null;
}
public static string MyTest()
{
ExchangeService myService = new ExchangeService(ExchangeVersion.Exchange2007_SP1);
myService.Credentials = new NetworkCredential("USERNAME", "PASSWORD", "DOMAIN");
myService.Url = new Uri("https://MAILSERVER/ews/exchange.asmx");
Folder myPublicFoldersRoot = Folder.Bind(myService, WellKnownFolderName.PublicFoldersRoot);
string myPublicFolderPath = @"PUBLIC_FOLDER_CALENDAR_NAME";
string[] folderPath = myPublicFolderPath.Split('\\');
FolderId fId = myPublicFoldersRoot.Id;
foreach (string subFolderName in folderPath)
{
fId = Program.FindPublicFolder(myService, fId, subFolderName);
if (fId == null)
{
return string.Format("ERROR: Can't find public folder {0}", myPublicFolderPath);
}
}
Folder folderFound = Folder.Bind(myService, fId);
if (String.Compare(folderFound.FolderClass, "IPF.Appointment", StringComparison.Ordinal) != 0)
{
return string.Format("ERROR: Public folder {0} is not a Calendar", myPublicFolderPath);
}
CalendarFolder AK_Calendar = CalendarFolder.Bind(myService, fId, BasePropertySet.FirstClassProperties);
FindItemsResults<Appointment> AK_appointments = AK_Calendar.FindAppointments(new CalendarView(DateTime.Now,DateTime.Now.AddDays(1)));
string rString = string.Empty;
foreach (Appointment AK_appoint in AK_appointments)
{
rString += string.Format("Subject: {0}<br />Date: {1}<br /><br />", AK_appoint.Subject, AK_appoint.Start);
}
return rString;
}
}
}
FindItemsResults<Appointment>
看起来不错。我觉得你忘记为CalendarView
设置PropertySet
了,这很重要。如果你只使用搜索结果中的Subject
和Start
属性,那么你应该设置这两个属性ItemSchema.Subject
和AppointmentSchema.Start
。如果你不这样做,所有的PropertySet.FirstClassProperties
都会从 Exchange 服务器发送过来。我在文件夹绑定中包含了这个属性集,只是为了展示有多少个属性。此外,我建议你继续使用分页。 - OlegItemView
和FindItemsResults<Item>
的原因是我修改了另一个枚举电子邮件的示例。在邮箱文件夹中,您不仅会找到电子邮件,还会找到符合约会要求的内容。因此,为了枚举邮箱,最好使用基础类Item
。似乎在日历文件夹中您不会遇到这个问题,但请考虑这个可能的问题。祝一切顺利! - Oleg