首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未通过ServiceBehavior应用IDispatchMessageFormatter

未通过ServiceBehavior应用IDispatchMessageFormatter
EN

Stack Overflow用户
提问于 2012-05-04 22:54:13
回答 1查看 1.2K关注 0票数 0

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

我不是手动将OperationBehavior应用于所有操作,而是尝试从ServiceBehavior中遍历所有操作(序列化程序的细节并不重要,重要的是它实现了IDispatchMessageFormatter):

代码语言:javascript
复制
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中应用格式化程序,如下所示:

代码语言:javascript
复制
public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation) {
    LoggedOperationSerializer serializer = new LoggedOperationSerializer(dispatchOperation.Formatter);
    dispatchOperation.Formatter = serializer;
}

然后,如预期的那样命中DeserializeRequest方法。

如果如图所示同时应用ServiceBehvior和OperationBehavior并附加调试器,则首先命中所示的第一个代码块,遍历服务上的所有操作,然后设置格式化程序。但是,在命中OperationBehavior的ApplyDispatchBehavior时,上面设置的格式化程序已经“脱落”,并被默认的CompositeDispatchFormatter所取代。

我真的不想手动将OperationBehavior应用到所有操作中才能让它工作……你知道为什么会发生这样的事情吗?

这是在所有相关的情况下使用WebHttpBinding,但我不知道为什么会这样。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-04 23:13:59

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

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

如果您不想将操作行为添加到服务中的所有操作,则可以使用端点行为,该行为添加在端点中的WebHttpBehavior之后,或者使用从WebHttpBehavior派生的端点,在该端点中,您只需覆盖ApplyDispatchBehavior,首先调用基本实现,然后遍历协定中的所有操作以设置LoggedOperationSerializer

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10451226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档