Introduction
今やレガシーな子扱いになってしまった WCF (参考 .NET 5 に含まれない機能)。
とはいっても WCF を使っているプロダクトはまだあるわけで、開発している最中に遭遇したのが掲題のエラー。
現象として
- サーバー側では、例外を投げることもなく、
ServiceContractを実装したサービスのreturnも問題なく通る- ただし、これは例外設定で特定の例外を無視していたため、実際には 
returnを抜けた際に、例外で停止してた (アタッチしていた時のみ) 
 - ただし、これは例外設定で特定の例外を無視していたため、実際には 
 - 他のサービスメソッドはクライアントから問題なく呼び出せるのに、あるサービスメソッドだけ掲題のエラー
 - 「サービスの参照」は実行しており、I/F に齟齬はない
 - タイムアウトするようなデータ量でもない
 
なぁぜ?
How to resolve?
結論から言えば、サービス側が返すデータが例外を投げていたのが原因。
通常、データをクライアントに返す際は、そのデータはシリアル化可能であることが必須である。
例えば、下記のような感じ。
1  | []  | 
この例は非常にシンプルだったのだが、問題のデータはちょっと酷かった。
1  | []  | 
これは極端な例だが、シリアル化対象のメンバーが例外を投げてしまうような構造をしていたのである。
なので、対処は簡単だったのだが…
自宅で検証している際に、エラーの内容が微妙に違うことに気づいた。
会社で遭遇したのは UWP のプログラムで、WCF のサービスを呼び出していた。
自宅での検証は UWP なんて面倒なので、.NET Framework のコンソールアプリで検証した。
結局、会社で遭遇結果と違ったので、UWP のコンソールアプリを作った。
サービス側は .NET Framework で作成し、UWP も .NET Framework のクライアント双方が同じサービスに接続したとする。
.NET Framework のコンソールアプリ
1  | 2024-04-27 21:24:19.9368 [ERROR] Error  | 
UWP のコンソールアプリ
1  | 2024-04-27 22:10:50.3144 [ERROR] Error  | 
例外発生時の InnerException を再帰で調べ Message と HResult のプロパティをログに出したが、見事に内容が違う。
特に会社で調査していた時は、An error occurred while sending the request. の表示惑わされ、クライアントの問題かと思い、無駄に時間を過ごしてしまった。
