0

一連の学生と教師の間の会議を管理する Java Web アプリを作成しています。全員が既に Outlook を使用して電子メールと個人の予定表を管理しています。

Exchange、Office365、または Sharepoint Team Calendar を使用して、REST サービスを介して Web アプリのスケジュール機能を構築して、空き状況を確認し、生徒と教師の 1 人が利用できる会議を作成できるかどうかを知りたいです。

SharePoint 2013 REST サービス

これまでのところ、私が見つけた最も有望なメカニズムは、Microsoft Sharepoint Server のカレンダーです。これは、コラボレーション機能により、会議を作成し、ユーザー リストの空き状況を確認することを可能にします。欠点は、1 対 1 の会議ではなく、チーム全体 (私が見つけた限り) をサポートしていることです。

私の 2 番目のオプションは、グループ内の全員 (学生と学科の教師) に個人の予定表を公開するように要求することです。これにより、Web アプリは学生と教師の両方の空き状況を確認し、会議出席依頼を送信できるようになります。明らかな問題は、このアプローチに由来するプライバシー/セキュリティの懸念です。

私の最後のオプション (車輪を再発明するような気がするので、あまり好まれません) は、Web アプリ内で独自のカレンダーを作成し、iCal リクエストを各ユーザーに送信することです。このアプローチの明らかな問題は、2 つの別々のカレンダー間の同期です。

さらに、この機能は非常に一般的なニーズであるため、Exchange/Sharepoint/Office365 を利用して実装する方法を説明するブログがたくさんあるはずです (私の雇用主のインフラストラクチャは Microsoft に基づいているため、他のプラットフォームは考慮されていません)。しかし、それが明らかすぎて誰もそれについて話していないのか、それとも私が適切な場所で検索していないのか. 私を正しい方向に向けるためのアドバイスはありますか?

4

1 に答える 1

2

Exchange は、EWS (Exchange Web サービス) で公開されているユーザー カレンダーの可用性をネイティブに表示します。ネットワーク管理者は、EWS を有効にする Exchange サーバーを構成する必要があります。しかし、どうなるでしょうか... Office 365 (私が知っているように) は EWS サービスを有効にしているため、交換は Office 365 オファーの一部です。

EWS は通常の Web サービスであるため、Java で使用するものに「サービス スタブ」またはプロキシを作成して、wsdl ファイルをマッピングするサービス参照を作成する必要があります。

Exchangeed 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();
    }
}
于 2013-09-11T04:09:31.710 に答える