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.
の表示惑わされ、クライアントの問題かと思い、無駄に時間を過ごしてしまった。