IDispatchMessageFormatter未通过ServiceBehavior应用

Hoo*_*lum 0 wcf

我需要将自定义消息格式化程序应用于服务中的所有操作.

我没有手动将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;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

串行器似乎设置得很好,没有错误.但是,当我设置断点和调试时,永远不会触发LoggedOperationSerializer上的DeserializeRequest方法.

相反,如果我在这样的OperationBehavior中应用格式化程序:

public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation) {
    LoggedOperationSerializer serializer = new LoggedOperationSerializer(dispatchOperation.Formatter);
    dispatchOperation.Formatter = serializer;
}
Run Code Online (Sandbox Code Playgroud)

然后按预期命中DeserializeRequest方法.

如果我同时应用ServiceBehvior和OperationBehavior并按预期附加调试器,则首先触发显示的第一个代码块,迭代服务上的所有操作,并设置格式化程序.但是,当命中OperationBehavior的ApplyDispatchBehavior时,上面设置的格式化程序已"掉线",并且已被默认的CompositeDispatchFormatter替换.

我真的不想手动将OperationBehavior应用于所有操作以使其工作......任何关于为什么会发生什么的想法?

这是在使用WebHttpBinding的情况下完全相关,我不知道为什么会这样.

car*_*ira 6

如果您正在使用WebHttpBinding,我假设您也在使用WebHttpBehavior终端中的.如果是,则WebHttpBehavior覆盖您在服务行为中添加的格式化程序.

对于WCF中的所有行为,在ApplyDispatchBehavior调用时,按以下顺序调用它:服务行为,合同行为,端点行为,操作行为(这解释了为什么当您使用它运行的操作行为时).WebHttpBehavior将设置其格式化程序来处理诸如理解JSON输入,映射到URI模板等的事情.

如果您不想将操作行为添加到服务中的所有操作,则可以使用端点行为,在端点中的WebHttpBehavior 之后添加,或者从WebHttpBehavior仅覆盖的位置派生的端点ApplyDispatchBehavior,首先调用基本实现,然后你循环完成合同中的所有操作来设置你的LoggedOperationSerializer.