如何对可用性检查进行编程,以及如何在 Outlook 中创建新会议



我正在创建一个Java Web应用程序来管理一组学生和教师之间的会议。他们都已使用 Outlook 来管理其电子邮件和个人日历。

我想知道是否有可能通过 REST 服务使用 Exchange、Office365 或 SharePoint 团队日历构建我的 Web 应用程序的日程安排功能,以便检查可用性并为学生和可用的教师之一创建会议:

SharePoint 2013 REST 服务

到目前为止,我发现的最有希望的机制是Microsoft Sharepoint Server的日历,其协作功能可以创建会议并检查用户列表的可用性。缺点是它不支持一对一的会议,而是支持整个团队(据我发现)。

我的第二个选择是要求组中的每个人(该系的学生和教师)公开他们的个人日历,以便 Web 应用程序能够检查学生和教师的可用性并发送会议请求。显而易见的问题是这种方法产生的隐私/安全问题。

我的最后一个选择(也是迄今为止不太喜欢的选择,因为它感觉就像重新发明轮子)是在网络应用程序中构建一个专有日历,并向每个人发送iCal请求。这种方法的明显问题是两个分离的日历之间的同步。

此外,此功能必须是一个非常普遍的需求,因此应该有大量的博客解释如何利用Exchange/Sharepoint/Office365来实现它(由于我的雇主的基础架构基于Microsoft,因此不考虑其他平台)。但是,无论是很明显以至于没有人谈论它,还是我没有在正确的地方搜索。有什么建议可以指出我正确的方向吗?

Exchange

本机显示 EWS(Exchange Web 服务)中公开的用户日历可用性,网络管理员必须配置启用 EWS 的 Exchange 服务器。但你猜怎么着...Office 365(据我所知)启用了 EWS 服务,到期交换是 Office 365 优惠的一部分。

由于 EWS 是普通的 Web 服务,因此您应该在 Java 中使用的任何内容中创建一个"服务存根"或代理来创建映射 wsdl 文件的服务引用。

交换 EWS 是我的首选解决方案。

希望这有帮助。

这是参考页,此链接显示如何使用 C# 中的服务引用进行正确的 API 调用。

http://msdn.microsoft.com/en-us/library/exchange/aa494212(v=exchg.140).aspx

static void GetUserAvailability(ExchangeServiceBinding esb)
{
    // Identify the time to compare free/busy information.
    Duration duration = new Duration();
    duration.StartTime = DateTime.Now;
    duration.EndTime = DateTime.Now.AddHours(4);
    // Identify the options for comparing free/busy information.
    FreeBusyViewOptionsType fbViewOptions = new FreeBusyViewOptionsType();
    fbViewOptions.TimeWindow = duration;
    fbViewOptions.RequestedView = FreeBusyViewType.MergedOnly;
    fbViewOptions.RequestedViewSpecified = true;
    fbViewOptions.MergedFreeBusyIntervalInMinutes = 35;
    fbViewOptions.MergedFreeBusyIntervalInMinutesSpecified = true;
    MailboxData[] mailboxes = new MailboxData[1];
    mailboxes[0] = new MailboxData();
    // Identify the user mailbox to review for free/busy data.
    EmailAddress emailAddress = new EmailAddress();
    emailAddress.Address = "tplate@contoso.com";
    emailAddress.Name = String.Empty;
    mailboxes[0].Email = emailAddress;
    mailboxes[0].ExcludeConflicts = false;
    // Make the request.
    GetUserAvailabilityRequestType request = new GetUserAvailabilityRequestType();
    // Set the time zone of the request.
    request.TimeZone = new SerializableTimeZone();
    request.TimeZone.Bias = 480;
    request.TimeZone.StandardTime = new SerializableTimeZoneTime();
    request.TimeZone.StandardTime.Bias = 0;
    request.TimeZone.StandardTime.DayOfWeek = DayOfWeekType.Sunday.ToString();
    request.TimeZone.StandardTime.DayOrder = 1;
    request.TimeZone.StandardTime.Month = 11;
    request.TimeZone.StandardTime.Time = "02:00:00";
    request.TimeZone.DaylightTime = new SerializableTimeZoneTime();
    request.TimeZone.DaylightTime.Bias = -60;
    request.TimeZone.DaylightTime.DayOfWeek = DayOfWeekType.Sunday.ToString();
    request.TimeZone.DaylightTime.DayOrder = 2;
    request.TimeZone.DaylightTime.Month = 3;
    request.TimeZone.DaylightTime.Time = "02:00:00";
    // Add the mailboxes to the request.
    request.MailboxDataArray = mailboxes;
    // Add the view options to the request.
    request.FreeBusyViewOptions = fbViewOptions;
    try
    {
        // Send the request and get the response.
        GetUserAvailabilityResponseType response = esb.GetUserAvailability(request);
        // Access free/busy information.
        if (response.FreeBusyResponseArray.Length < 1)
        {
            throw new Exception("No free/busy response data available.");
        }
        else
        {
            foreach (FreeBusyResponseType fbrt in response.FreeBusyResponseArray)
            {
                if (fbrt.ResponseMessage.ResponseClass == ResponseClassType.Error)
                {
                    Console.WriteLine(string.Format("Error: {0}", fbrt.ResponseMessage.MessageText));
                }
                else
                {
                    // Show the free/busy stream.
                    FreeBusyView fbv = fbrt.FreeBusyView;
                    Console.WriteLine(string.Format("Merged free/busy data: {0}", fbv.MergedFreeBusy));
                }
            }
        }
    }
    catch (Exception e)
    {
        // Perform error processing.
        Console.WriteLine(e.Message);
        Console.ReadLine();
    }
}

最新更新