【问题标题】:WCF OperationBehavior: ApplyDispatchBehavior not being calledWCF OperationBehavior:未调用 ApplyDispatchBehavior
【发布时间】:2014-04-16 10:11:47
【问题描述】:

我的目标是为 WCF 创建一个端点行为,它向现有合同添加一个额外的 Ping() 操作。 EndpointBehavior 工作正常,当我运行我的服务并使用 WCF 测试客户端时,我实际上可以看到添加的 Ping() 操作。我已按如下方式实现了此端点行为:

配置:

<configuration>
  <system.serviceModel>

    <services>
      <service name="X">
        <endpoint address="mex" kind="mexEndpoint" />
        <endpoint address="" binding="basicHttpBinding" contract="IX" 
             behaviorConfiguration="ping" />
      </service>
    </services>

    <behaviors>
      <endpointBehaviors>
        <behavior name="ping">
          <PingEndpointBehavior />
        </behavior>
      </endpointBehaviors>
    </behaviors>

    <extensions>
      <behaviorExtensions>
        <add name="PingEndpointBehavior" 
          type="Assembly.PingEndpointBehavior, Assembly, .. />
      <behaviorExtensions>
    </extensions>

  </system.serviceModel>
</configuration>

端点行为:

public class PingEndpointBehavior : BehaviorExtensionElement, IEndpointBehavior
{
    ...

    public void ApplyDispatchBehavior(ServiceEndpoint endpoint, 
      EndpointDispatcher endpointDispatcher)
    {
        var cd = endpoint.Contract;

        var inputMessage = new MessageDescription(...);
        var outputMessage = new MessageDescription(...); 
        // Set input/output messages correctly

        var od = new OperationDescription("Ping", cd);
        od.Messages.Add(inputMessage);
        od.Messages.Add(outputMessage);

        od.Behaviors.Add(new DataContractSerializerOperationBehavior(od));
        od.Behaviors.Add(new PingOperationBehavior());

        endpoint.Contract.Operations.Add(od);
    }

    ...
}

但是,操作行为不起作用。操作行为上的ApplyDispatchBehavior() 方法永远不会被调用,因此,我自己的PingInvoker 没有被使用。这导致在调用添加的Ping() 操作到合约时没有得到响应。

原因似乎是OperationBehavior 仅在服务已经启动之后 才被添加,导致ApplyDispactchBehavior 没有被调用。见以下代码:

操作行为:

public class PingOperationBehavior : IOperationBehavior
{
    ...

    public void ApplyDispatchBehavior(OperationDescription od, DispatchOperation do)
    {
        do.Invoker = new PingInvoker();    
    }

    ...
}

调用者:

public class PingInvoker : IOperationInvoker
{
    ...

    public object Invoke(object instance, object[] inputs, out object[] outputs)
    {
        outputs = new object[0];
        return Ping();
    }

    public static DateTime Ping()
    {
        return DateTime.Now;
    }

    ...
}

有人知道如何让OperationBehavior 正常工作吗?

注意:

  • 应该适用于 IIS 中托管的服务(非自托管)
  • 除了在配置中添加行为(并引用包含该行为的程序集)之外,我不想更改服务上的任何内容

【问题讨论】:

  • 您是否为 PingEndpointBehavior 实现了 CreateBehavior 方法:受保护的覆盖对象 CreateBehavior()?
  • 在您的示例中调用“Ping”时出现合同不匹配。你能提供更多你的代码吗?我也想在我们的应用程序中进行这项工作。

标签: c# wcf endpointbehavior


【解决方案1】:

我的自定义行为也有同样的问题。我是从 WebHttpBehavior(继承自 IEndpointBehavior)派生的,但未调用 ApplyDispatchBehavior。

我的问题的解决方案是添加缺少的覆盖关键字,例如: public override void ApplyDispatchBehavior(...

【讨论】:

  • 当我添加 :"override" 时,它不会编译:找不到合适的方法来覆盖。
  • 您确定您的类是从 IEndpointBehavior 继承的吗?或者,也许我们的 .Net 版本有所不同。我正在使用 4.6.1
  • 这不是一个可覆盖的方法,你确定这是你的处理方式
  • 是的,这就是我在运行系统中仍然拥有的: public class TWSWebHttpBehavior : WebHttpBehavior { public override void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher) { base.ApplyDispatchBehavior(endpoint, endpointDispatcher); TWSMessageInspector 检查器 = new TWSMessageInspector(); endpointDispatcher.DispatchRuntime.MessageInspectors.Add(inspector); } }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-22
  • 1970-01-01
相关资源
最近更新 更多