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 回答