我需要将自定义消息格式化程序应用于服务中的所有操作。
因此,我没有将 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 以防万一,但我不知道为什么会这样。