問題
.NETエージェントがWindows Communication Foundation(WCF)アプリケーションに対して有効になっている場合、応答ヘッダーContent-Typeが予期せずapplication/xmlに変更されます。
解決
Basic solutions | Comments |
|---|---|
クロスアプリケーショントレーシング(CAT)機能を無効にします。 | CAT設定を変更する方法についてお読みください。 CATを有効のままにする必要がある場合は、他のソリューションを参照してください。 |
CATの代わりにディストリビューティッド(分散)トレーシング機能を使用します。 | DT設定を有効にする方法についてお読みください。 DTはトレースを実行するための新しく改善された方法であり、CATと比較してNew Relic UIの機能が強化されています。 DTは応答ヘッダーを変更する必要がなく、応答ヘッダーを変更しても影響を受けません。 |
メッセージと | このソリューションでは、アプリケーションコードを変更する必要があります。 |
原因
クロスアプリケーショントレーシング(CAT)機能は、.NETエージェントでデフォルトで有効になっています。CATは、リクエストメッセージと応答メッセージの両方にヘッダーを追加することによって機能します。
これは、エージェントで発生する内容です。
- WCFサービスメソッドの実装が実行されます。
- エージェントは、CATヘッダーを使用して
HttpResponseMessagePropertyインスタンスをOperationContext.Current.OutgoingMessagePropertiesに追加することで、WCF応答にCATヘッダーを追加しようとします。 - カスタム
DispatchMessageFormatterが実行され、新しいメッセージが作成されます。ここで、予期されるContent-Typeヘッダーが新しいメッセージに直接追加されます。 - MicrosoftのWCF実装は、応答メッセージで定義されたメッセージプロパティを
OperationContextで定義されたメッセージプロパティとマージしようとします。詳細については、ImmutableDispatchRuntime.cs に関するこのMicrosoftリファレンスを参照してください。 HttpResponseMessagePropertyはマージをサポートしていないため、メッセージで定義されている値の代わりに、OperationContextで定義されている値が使用されます。- その結果、フォーマットされたメッセージに最初に追加された
Content-Typeヘッダーは破棄され、デフォルトのContent-Typeヘッダーが使用されます。
エージェントは複数のWCFバインディングをサポートする必要があるため、CATヘッダーをOperationContextに追加する必要があります。