我需要将自定义消息格式化程序应用于服务中的所有操作。
我不是手动将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,但我不知道为什么会这样。
发布于 2012-05-04 23:13:59
如果您正在使用WebHttpBinding,我假设您在端点中也在使用WebHttpBehavior。如果是这样,则WebHttpBehavior将覆盖您在服务行为中添加的格式化程序。
对于WCF中的所有行为,当调用ApplyDispatchBehavior时,将按以下顺序调用它:服务行为、契约行为、端点行为、操作行为(这解释了为什么使用操作行为时它可以工作)。WebHttpBehavior将设置它的格式化程序来处理诸如理解JSON输入、映射到URI模板等事情。
如果您不想将操作行为添加到服务中的所有操作,则可以使用端点行为,该行为添加在端点中的WebHttpBehavior之后,或者使用从WebHttpBehavior派生的端点,在该端点中,您只需覆盖ApplyDispatchBehavior,首先调用基本实现,然后遍历协定中的所有操作以设置LoggedOperationSerializer。
https://stackoverflow.com/questions/10451226
复制相似问题