サービス内のすべての操作にカスタムメッセージフォーマッターを適用する必要があります。
OperationBehaviorをすべての操作に手動で適用するのではなく、ServiceBehavior内からすべての操作をループしようとしています(シリアライザーの詳細は重要ではなく、IDispatchMessageFormatterを実装しているだけです)。
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase) {
foreach (ChannelDispatcher channelDispatcher in serviceHostBase.ChannelDispatchers) {
foreach (EndpointDispatcher endpointDispatcher in channelDispatcher.Endpoints.Where(e => !e.IsSystemEndpoint)) {
foreach (DispatchOperation dispatchOperation in endpointDispatcher.DispatchRuntime.Operations) {
LoggedOperationSerializer serializer = new LoggedOperationSerializer(dispatchOperation.Formatter);
dispatchOperation.Formatter = serializer;
}
}
}
}
シリアライザーはエラーなしで正常に設定されているようです。ただし、ブレークポイントを設定してデバッグしたときに、LoggedOperationSerializerのDeserializeRequestメソッドがヒットすることはありません。
代わりに、次のようなOperationBehavior内にフォーマッターを適用する場合:
public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation) {
LoggedOperationSerializer serializer = new LoggedOperationSerializer(dispatchOperation.Formatter);
dispatchOperation.Formatter = serializer;
}
次に、DeserializeRequestメソッドが期待どおりにヒットします。
示されているようにServiceBehviorとOperationBehaviorの両方を適用し、期待どおりにデバッガーをアタッチすると、最初に示されているコードブロックがヒットし、サービスのすべての操作が繰り返され、フォーマッターが設定されます。ただし、OperationBehaviorのApplyDispatchBehaviorがヒットするまでに、上記で設定されたフォーマッターは「フォールオフ」し、デフォルトのCompositeDispatchFormatterに置き換えられています。
これを機能させるために、すべての操作に手動でOperationBehaviorを適用する必要は本当にありません...なぜ何が起こっているのかについてのアイデアはありますか?
これは、関連性がある場合に備えてWebHttpBindingを使用していますが、なぜそうなるのかわかりません。