件名や本文などに無効な制御文字が含まれていると EWS でアイテムを取得する際に System.Xml.XmlException が発生する

現象

Exchange Web Services (EWS) を利用してアイテムを取得する場合、件名や本文などに無効な制御文字が含まれていると以下の例外が発生して取得操作に失敗します。
   System.InvalidOperationException: XML ドキュメント (98,-1122) でエラーが発生しました。
--> System.Xml.XmlException: ' ' (16 進数値 0x01) は無効な文字です。 行 98、位置 -1122 です。

なお、無効な制御文字が含まれていても Outlook や Outlook Web App (OWA) ではアイテムにアクセスすることができます。

原因

EWS の GetItem や FindItem などを利用してアイテムを取得する場合、Exchange Server はアイテムのプロパティに保存されている値をそのまま XML の各要素に割り当ててクライアントにデータを返します。件名や本文などに無効な制御文字が含まれていると XML データにテキスト以外の文字が含まれることになるため、XML Validation を実施するクライアントでは XML データとして不正であると判断してエラーが発生します。

解決方法

.NET Framework から EWS を呼び出す場合、XmlTextReader の Normalization を false に設定することによりアイテムを取得する際に例外が発生しないように制御することができます。Visual Studio で自動生成された Proxy クラスでは Normalization が true に設定されて直接変更することができないため、以下のように自動生成された Proxy クラスをオーバーライドして Normalization を false に変更する必要があります。最後に、これまでアプリケーション内部で使用していた ExchangeServiceBinding を MyExchangeServiceBinding に置換することで本現象を回避することができます。

   public partial class MyExchangeServiceBinding : ExchangeServiceBinding 
{
/// <summary>
/// Override the default behavior of the SOAP reader to handle characters which aren't valid in strings
/// </summary>
/// <param name="message"></param>
/// <param name="bufferSize"></param>
/// <returns></returns>
protected override XmlReader GetReaderForMessage(SoapClientMessage message, int bufferSize)
{
XmlReader retval = base.GetReaderForMessage(message, bufferSize);
XmlTextReader xrt = retval as XmlTextReader;
if (null != xrt)
{
xrt.Normalization = false;
}
return retval;
}
}

詳細

この問題の詳細については、以下の Microsoft TechNet Web サイトを参照してください。

   XML Validation Errors When You Submit Exchange Web Services Requests
   http://technet.microsoft.com/ja-jp/library/gg585107(v=exchg.80).aspx
プロパティ

文書番号:2774517 - 最終更新日: 2016/09/29 - リビジョン: 1

Microsoft Exchange Server 2010 Enterprise, Microsoft Exchange Server 2010 Service Pack 1, Microsoft Exchange Server 2010 Service Pack 2, Microsoft Exchange Server 2010 Standard

フィードバック