0

サービス内のすべての操作にカスタムメッセージフォーマッターを適用する必要があります。

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を使用していますが、なぜそうなるのかわかりません。

4

1 に答える 1

6

を使用している場合は、エンドポイントでWebHttpBindingもを使用していると想定しています。WebHttpBehaviorその場合、WebHttpBehaviorはサービス動作で追加したフォーマッターをオーバーライドします。

WCFのすべての動作で、ApplyDispatchBehaviorが呼び出されると、次の順序で呼び出されます:サービス動作、コントラクト動作、エンドポイント動作、操作動作(操作動作を使用すると機能する理由を説明します)。WebHttpBehaviorは、JSON入力の理解、URIテンプレートへのマッピングなどを処理するように、フォーマッターを設定します。

サービス内のすべての操作に操作動作を追加したくない場合は、エンドポイントのWebHttpBehaviorのWebHttpBehaviorに追加されたエンドポイント動作、またはオーバーライドするだけの場所から派生したエンドポイントを使用してApplyDispatchBehavior、最初に基本実装を呼び出すことができます。次に、コントラクト内のすべての操作をループして、を設定しますLoggedOperationSerializer

于 2012-05-04T15:13:59.070 に答える