このエラーは、XML が壊れているというより、SOAP の流儀を取り違えている時に出やすいです。
The content type application/soap+xml; charset=utf-8 of the response message does not match the content type of the binding (text/xml; charset=utf-8)
要するに、
- 片方は SOAP 1.2 のつもりで話している
- もう片方は SOAP 1.1 のつもりで受けている
というずれです。
なぜ起きるのか
SOAP 1.1 と SOAP 1.2 では、HTTP 上の約束も少し違います。
- SOAP 1.1 では
text/xmlとSOAPActionを使うことが多い - SOAP 1.2 では
application/soap+xmlを使い、action もそちら側に寄る
そのため、client や proxy が違う binding を選ぶと、本文がそれっぽく見えていてもライブラリ側で即座に弾かれます。
最初に見たい点
- WSDL のどの binding / port を使っているか
- サービスが SOAP 1.1 と 1.2 の両方を出していないか
- 実際の
Content-Typeが何か - 生成コードやクライアント設定が、想定した binding と一致しているか
「SoapUI では通るのにアプリからだけ失敗する」という時は、ツールごとに選んだ binding が違うだけ、ということが本当によくあります。
先に XML を疑わない方がいい理由
namespace や Body の shape を細かく見る前に、このエラーでは binding レベルの取り違えを疑った方が早いです。
つまり、失敗しているのは業務データより前の層です。
SOAPless が効く場所
こういう binding の選択や SOAP version の固定は、1 つの連携境界に寄せておく方が安全です。
一度正しい binding を掴んだら、その複雑さを各クライアントに再配布せず、下流には JSON の入口だけを渡す方が保守しやすくなります。