分析
お客様の会社には、Microsoft SharePoint 2010で作成された内部ポータルがあり、毎日約1,500人の従業員が使用していることがわかっています。 さらに、会社はExchangeを構成しています。
ご存知のように、Exchangeには既に会社のリソースを予約する機能があります。 この全体は、ルームメールボックスを使用して実装されます。 実際、各会議室には独自の住所があり、従業員はこの会議室で会議を計画する必要があります。 電子メールクライアントを使用している他のユーザーは、カレンダーに接続して、予定の日時を確認できます。 さらに、Outlook 2010にはRoom Finderの機能があります。
Exchangeのメールボックスについて詳しくは、 http://technet.microsoft.com/en-us/library/bb124952(v = exchg.141).aspxをご覧ください。
そしてここ-Room Finder'e http://support.microsoft.com/kb/2673231について
すべてがクールで快適なようです。 ただし、いくつかの欠点があります。まず、従業員にはOutlookが必要です。 第二に、部屋の説明は非常に貧弱です;リソース(ボード、会議システムなど)の説明を視覚的な形式で追加することはできません。
したがって、Exchangeの機能を失うことなく、SharePointのすべての視覚的表現をどのように取り出すことができるのかという考えが生まれました。 同時に、より少ないコードを書きたいと思いました。 しかし、実践が示しているように、それなしではできませんでした:)
一般的に、行こう!
SharePoint
サービスを作成するために、部門、会議室、会議室の予約という3つのリストを作成しました。
ユニットは都市のブランチです。
会議室は、次のような部屋とその特性を保存するためのリストです。
- お名前
- ユニット
- 容量;
- プロジェクター、マーカー会議ボードなどの部屋での存在
- MS Exchangeとの統合に使用される郵送先住所。
そして最後に、鎧のリスト:
- 部屋
- 会議の日付。
- 開始時間;
- 終了時間;
- 予約の著者。
リストがありますが、誰かがこれらのリストに記入する必要があるため、ユーザーをロールに分割しました。
- ユーザーは、会議や会議を計画したり、会議室を予約したり、パラメータで特殊な検索を実行したりできます。
- ユニットの会議室の管理者は、ユニット内の既存の予約を転送/キャンセルできます。
- 管理者は、会議室、およびその特性(座席数、プロジェクター、ボードなど)を含むディレクトリを作成および編集します。 部門を切り替えて、会議室の管理者として機能する機能があります。
UI
なぜなら 顧客のデザインがすでにポータルに取り込まれているため、デザイナーは少し作業をしなければなりませんでした。 彼らが非常にうまくやったこと:
1.ユーザーのホームページ:
2.別のリンクを使用して、部屋のリストに移動できます。 このリストには基本情報が表示されます。 部屋の名前をクリックすると、部屋に関する詳細情報が表示されます。
3.「オーディエンス検索」リンクには2週間のカレンダーが表示されます。 各セルには、部屋の予約者と時間を表示します。
4.「プラス記号」を個別にクリックすることにより、会議室を予約することができます。
実装
この美しさを実現するには、jsonを返すと同時にSharePointのコンテキストで機能するWCFサービスを作成する必要がありました。 この問題は、正しいweb.configおよびISAPIフォルダー内のSVCの存在によって解決されます。 jsonを送信するようにweb.configを適切に構成する方法について多くのことが書かれています。 たとえば、ここに:
http://www.codeproject.com/Articles/105273/Create-RESTful-WCF-Service-API-Step-By-Step-Guide
次に、いくつかのASPXページを作成し、モジュールに追加し、knockoutフレームワークを使用してjavascriptでWCFサービスを操作するロジック全体を実装しました。
Exchangeで発生した主な問題。 ほぼすべての必要な機能は、 EWSマネージAPIメソッドの呼び出しを通じて実装されます。 ただし、ルームのリストにアイテムを作成するときに、メールボックスを自動的に作成する必要がありました。
インターネットでは、メールボックスはpowershellを介してのみ作成でき、C#コードからコマンドを呼び出すことは原則的に問題ではないことがわかりました。
ルームのリストにイベントレシーバーを作成し、RunspaceおよびWSManConnectionInfoを使用してリモートサーバーでpowershellコマンドを呼び出そうとしました。 ただし、第一に、それは安全ではありません。第二に、接続中に拒否されたアクセスの問題のため、これを行うことに成功しませんでした。
その結果、別のWCFサービスを作成し、Exchangeを備えたサーバーに展開することにしました。 本質的に、このサービスにはメソッドが1つしかありません。
public void CreateRoom(ExchangeRoom Room) { RunspaceConfiguration runspaceConfig = RunspaceConfiguration.Create(); PSSnapInException snapEx = null; PSSnapInInfo psinfo = runspaceConfig.AddPSSnapIn("Microsoft.Exchange.Management.PowerShell.E2010", out snapEx); using (Runspace runSpace = RunspaceFactory.CreateRunspace(runspaceConfig)) { runSpace.Open(); if (!(MailBoxAlreadyExist(Room.Email, runSpace))) { Command createMailbox = new Command("New-Mailbox"); createMailbox.Parameters.Add("UserPrincipalName", Room.Email); createMailbox.Parameters.Add("Name", Room.Name); createMailbox.Parameters.Add("Room"); using (Pipeline pipeLine = runSpace.CreatePipeline()) { pipeLine.Commands.Add(createMailbox); pipeLine.Invoke(); } } else { throw new Exception(" "); } } }
上で書いたように、すべての作業ロジックはWCFサービスを介して実装されているため、Exchangeで部屋を予約する方法でサービスを補完することは論理的でした。 これを行うために、Exchangeで予約を作成するサービスメソッドを呼び出しました。 必要な情報はすべてMicrosoft.Exchange.Data.Appointmentに配置され、APIを使用してExchangeカレンダーに会議が作成されました。
public static void CreateReservation(Reservation reservation) { InitService(); var appointment = new Appointment(service); appointment.Subject = "Meeting"; appointment.Start = new DateTime(reservation.Date.Year, reservation.Date.Month, reservation.Date.Day, reservation.FromTime, 0, 0); appointment.End = new DateTime(reservation.Date.Year, reservation.Date.Month, reservation.Date.Day, reservation.ToTime, 0, 0); string roomMailboxAddress = string.Format("room_{0}@{1}",reservation.RoomId, SharePointConstantString.MailDomain); appointment.Location = reservation.RoomName; appointment.Resources.Add(roomMailboxAddress); appointment.RequiredAttendees.Add(reservation.User.Email); appointment.Save(SendInvitationsMode.SendToAllAndSaveCopy); }
「逆」同期の問題(つまり、カレンダーの従業員がOutlookで部屋を予約したとき)は、タイマージョブによって解決することが決定されました。 このジョブは、Exchangeからすべての情報を収集し、不足しているアーマーを作成し、キャンセルされたアーマーを削除しました。
合計
マイクロソフトテクノロジースタック上に構築され、包括的なソリューションのすべての利点を使用して、スケーラブルで柔軟なソリューションを取得できるようなアーキテクチャを作成しました。 システムはカスタマイズ可能で、標準のプラットフォームツールが付属しています。
今日は
- 同社の経営陣は、多数の従業員の効率を高める一般的なコラボレーションツールを受け取ります。
- 会社の従業員は仕事を計画し、主要な会議や会議をより簡単に、より早く、そして緊張なしに行う。
- ITスタッフは柔軟でスケーラブルなソリューションを得ました。これには標準ツールが付属しており、すぐに使用できる機能を最大限に活用できます。 そのため、SharePointとExchangeの新しいバージョンに切り替えても、特別な問題は発生しません。