ASP.NET Webサービスの隠し仕様:制御文字を含んだ文字列は(エンコードされていても)パースエラーになる


ASP.NET 3.5で引っかかったまさかの障害。

ローカルネットワーク向けのSOAP Webサービスへのアクセスがなぜか400 Bad Requestで失敗するという障害が起きていました。クライアント側も.NET FrameworkのWeb参照クライアントライブラリなので、SOAPリクエストが形式異常なんてことはないはず。その後のリトライもすべて失敗しているので偶発的な誤動作というものでもなさそう。
一体何が起こった?

答はタイトルの通り、SOAPリクエストの引数として文字列に制御文字が含まれていたことでした。
それも、クライアントライブラリ側はきっちりエンコード(実体参照化)してくれていたにもかかわらず、それが制御コードであればサーバ側は400 Bad Requestを返すのでした。
フレームワークのバグっぽい動きですねこれは。