我刚开始使用Microsoft Exchange Web Services。我希望能够做到以下几点:
这些会议在ASP.NET MVC应用程序中创建并保存到SQL Server数据库中。我只是希望将其与现场Exchange Server集成。到目前为止,我可以使用以下代码创建会议:
public static Task<string> CreateMeetingAsync(string from, List<string> to, string subject, string body, string location, DateTime begin, DateTime end)
{
var tcs = new TaskCompletionSource<string>();
try
{
ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2013);
service.Credentials = CredentialCache.DefaultNetworkCredentials;
//service.UseDefaultCredentials = true;
// I suspect the Service URL needs to be set from the user email address because this is then used to set the organiser
// of the appointment constructed below. The Organizer is a read-only field that cannot be manually set. (security measure)
service.AutodiscoverUrl(from);
//service.Url = new Uri(WebConfigurationManager.AppSettings["ExchangeServer"]);
Appointment meeting = new Appointment(service);
meeting.Subject = subject;
meeting.Body = "<span style=\"font-family:'Century Gothic'\" >" + body + "</span><br/><br/><br/>";
meeting.Body.BodyType = BodyType.HTML;
meeting.Start = begin;
meeting.End = end;
meeting.Location = location;
meeting.ReminderMinutesBeforeStart = 60;
foreach (string attendee in to)
{
meeting.RequiredAttendees.Add(attendee);
}
meeting.Save(SendInvitationsMode.SendToAllAndSaveCopy);
tcs.TrySetResult(meeting.Id.UniqueId);
}
catch (Exception ex)
{
tcs.TrySetException(ex);
}
return tcs.Task;
}
这会成功创建我的会议,将其放入Outlook中的用户日历中,并向所有与会者发送会议请求。尝试两次调用meeting.Save(SendInvitationsMode.SendToAllAndSaveCopy);
时,我注意到以下异常:
无法执行此操作,因为此服务对象已具有ID。要更新此服务对象,请改用Update()方法。
我想:很好,它可以保存物品以换取唯一身份证。我将此ID保存在我的应用程序数据库中,稍后使用它来编辑/取消会议。这就是我返回id:tcs.TrySetResult(meeting.Id.UniqueId);
这很好地保存在我的应用程序数据库中:
现在,我正在尝试更新会议的下一部分,但我找不到根据我保存的唯一标识符搜索项目的方法。我在code.msdn上找到的一个示例使用service.FindItems()
方法搜索主题的查询:
string querystring = "Subject:Lunch";
FindItemsResults<Item> results = service.FindItems(WellKnownFolderName.Calendar, querystring, view);
我不喜欢这个。用户可能有可能在我的应用程序之外创建一个巧合相同主题的会议,这就是我的应用程序并取消它。我试图确定是否可以在查询字符串中使用唯一ID,但这似乎不是possible。
我在上面的查询字符串页面上注意到,你可以搜索的最后一个属性是(未指定属性),它搜索“所有单词阶段属性”。我试过这样简单地将id放入查询中,但是这不会返回结果:
FindItemsResults<Item> results = service.FindItems(WellKnownFolderName.Calendar, "AAMkADJhZDQzZWFmLWYxYTktNGI1Yi1iZTA5LWVmOTE3MmJiMGIxZgBGAAAAAAAqhOzrXRdvRoA6yPu9S/XnBwDXvBDBMebkTqUWix3HxZrnAAAA2LKLAAB5iS34oLxkSJIUht/+h9J1AAFlEVLAAAA=", view);
答案 0 :(得分:2)
使用Appointment.Bind
静态函数,提供服务对象和数据库中保存的ItemId。请注意,会议工作流程(邀请,接受,拒绝)可以使用新的ItemId在同一日历上重新创建会议。但如果您只是在看自己日历上的会议,那么您应该没问题。