EWS Managed API の GetUserAvailability 実行時に NullReferenceException の例外が発生する現象について

今回は EWS Managed API の ExchangeService.GetUserAvailability メソッドを使用して空き時間情報の取得を試みた際に System.NullReferenceException の例外が発生する現象についてご紹介いたします。
本現象は Exchange Web Service を直接使用しているアプリケーションでは発生いたしませんが、EWS Managed API を使用しているアプリケーションでは取得対象が Exchange 2007 / 2010 / 2013 / 2016 や Exchange Online のいずれの場合でも発生することを確認しておりますのでご注意ください。

現象
EWS Managed API ではユーザーの空き時間情報を取得する方法として ExchangeService.GetUserAvailability メソッドが提供されています。
本メソッドにて大部分のユーザーについては空き時間情報を正常に取得出来ていますが、特定のユーザーに対して実行すると毎回以下の例外が発生して空き時間情報の取得に失敗します。

・System.NullReferenceException

Message: オブジェクト参照がオブジェクト インスタンスに設定されていません。Source : Microsoft.Exchange.WebServicesStackTrace:    場所 Microsoft.Exchange.WebServices.Data.EwsUtilities.ParseEnumValueList[T](IList`1 list, String value, Char[] separators)    場所 Microsoft.Exchange.WebServices.Data.WorkingPeriod.TryReadElementFromXml(EwsServiceXmlReader reader)    場所 Microsoft.Exchange.WebServices.Data.ComplexProperty.InternalLoadFromXml(EwsServiceXmlReader reader, XmlNamespace xmlNamespace, String xmlElementName, Func`2 readAction)    場所 Microsoft.Exchange.WebServices.Data.ComplexProperty.LoadFromXml(EwsServiceXmlReader reader, XmlNamespace xmlNamespace, String xmlElementName)    場所 Microsoft.Exchange.WebServices.Data.ComplexProperty.LoadFromXml(EwsServiceXmlReader reader, String xmlElementName)    場所 Microsoft.Exchange.WebServices.Data.WorkingHours.TryReadElementFromXml(EwsServiceXmlReader reader)    場所 Microsoft.Exchange.WebServices.Data.ComplexProperty.InternalLoadFromXml(EwsServiceXmlReader reader, XmlNamespace xmlNamespace, String xmlElementName, Func`2 readAction)    場所 Microsoft.Exchange.WebServices.Data.ComplexProperty.LoadFromXml(EwsServiceXmlReader reader, XmlNamespace xmlNamespace, String xmlElementName)    場所 Microsoft.Exchange.WebServices.Data.ComplexProperty.LoadFromXml(EwsServiceXmlReader reader, String xmlElementName)    場所 Microsoft.Exchange.WebServices.Data.AttendeeAvailability.LoadFreeBusyViewFromXml(EwsServiceXmlReader reader, FreeBusyViewType viewType)    場所 Microsoft.Exchange.WebServices.Data.GetUserAvailabilityRequest.ParseResponse(EwsServiceXmlReader reader)    場所 Microsoft.Exchange.WebServices.Data.ServiceRequestBase.ReadResponse(EwsServiceXmlReader ewsXmlReader)    場所 Microsoft.Exchange.WebServices.Data.SimpleServiceRequestBase.ReadResponse(HttpWebResponse response)    場所 Microsoft.Exchange.WebServices.Data.SimpleServiceRequestBase.InternalExecute()    場所 Microsoft.Exchange.WebServices.Data.GetUserAvailabilityRequest.Execute()    場所 Microsoft.Exchange.WebServices.Data.ExchangeService.GetUserAvailability(IEnumerable`1 attendees, TimeWindow timeWindow, AvailabilityData requestedData, AvailabilityOptions options)lang="EN-US">   }

なお、本現象が発生する際の特徴として以下の点が挙げられます。
・該当ユーザーが含まれている場合には問題が発生しないユーザーも含めて ExchangeService.GetUserAvailability メソッド自体が失敗する
・Outlook や OWA から該当ユーザーの空き時間情報を閲覧する場合には正常に表示される

発生条件
本現象は予定表の [稼働日] が全てオフに設定されているメールボックスを対象に EWS Managed API の ExchangeService.GetUserAvailability メソッドを実行した場合に発生いたします。

- 設定の確認方法
メールボックスに設定されている予定表の [稼働日] は Outlook や OWA のオプション画面から以下の箇所で確認することができます。

・Outlook 2013 の場合
 

・OWA の場合 (Exchange 2013)
 

なお、Exchange 2010 以降では Exchange 管理シェルから Get-MailboxCalendarConfiguration コマンド レットを実行することで管理者からでも確認することができます。

・Exchange 管理シェルの場合
 

* 予定表の [稼働日] が全てオフに設定されている場合には WorkDays パラメータは "None" となります。(既定値: Weekdays)

ワークアラウンド
現象が発生するメールボックスについて予定表の [稼働日] を 1 つ以上設定することで EWS Managed API の ExchangeService.GetUserAvailability メソッドを使用した場合でも例外が発生することなく空き時間情報が取得できるようになります。

補足
予定表の [稼働日] が全てオフに設定されている場合でも Exchange Server は適切な応答データ (XML) を返していますが、EWS Managed API 側で応答データを解析する際に [稼働日] が空であるという状態を処理出来ていないことで例外が発生しています。
このため、EWS Managed API を使用しないで Exchange Web Service を直接使用 (ExchangeServiceBinding.GetUserAvailability メソッドなど) する場合には今回の現象は発生いたしません。

- 注
EWS Managed API はオープン ソース プロジェクトの GitHub で現在管理されているモジュールとなります。

Title: .NET 用 EWS マネージ API をオープン ソースとして公開
URL: https://blogs.technet.com/b/exchangeteamjp/archive/2014/09/26/ews-managed-api-for-.net-is-now-open-source.aspx