我们为在Exchange 2007公用文件夹中设置的公司设置公共日历。我可以使用下面的代码检索当天的个人日历约会。我在网上搜索了高和低,我找不到某人从公共文件夹日历中检索日历信息的示例。使用Exchange Web服务API提取Exchange 2007公共日历约会
它似乎应该是可行的,但我不能为我的生活得到它的工作。我如何修改下面的代码来访问日历?我不想通过asp.net创建任何约会,只需检索一个简单的列表。我也接受任何其他建议。谢谢。
ADDED BOUNTY
- 我不能有史以来需要做到这一点的唯一的人。让我们为后代解决这个问题。
再次更新由于无知
- 我忘了,我工作的项目是.NET 2.0(非常重要的你不觉得?)。
*将我的代码解决方案BELOW *
- 我已经取代与结束了工作的代码我原来的代码示例。非常感谢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'看起来不错。在我看来,你忘记为'CalendarView'设置'PropertySet'。这很重要。如果您只使用搜索结果中的“约会”和“开始”约会属性,则应该设置这两个属性“ItemSchema.Subject”和“AppointmentSchema.Start”。如果你不这样做,所有'PropertySet.FirstClassProperties'将从Exchange服务器发送。我包括在文件夹绑定这个属性集只显示有多少。此外,我建议你继续使用分页。 –
Oleg
2010-09-14 21:49:16
顺便说一下'ItemView'和'FindItemsResults- '的用法是因为我修改了另一个枚举电子邮件的例子。在邮箱文件夹中,您不仅可以找到**电子邮件,还可以找到符合预约的要求。所以要枚举邮箱,最好使用基类“Item”。看起来,用日历文件夹你不会有问题,但想想这个可能的问题。最好的问候和祝你好运! –
Oleg
2010-09-14 21:54:46
@Oleg我将继续分页。我把PropertySet关闭了,因为我想玩弄所有的属性。一旦我确定了我想要使用的属性,我将添加它。我现在只会坚持使用日历,但如果需要访问电子邮箱,我将使用Itemview。 – NinjaBomb 2010-09-15 02:46:03