3

Ping()私の目標は、WCF の endpointbehavior を作成することです。これにより、既存のコントラクトに追加の操作が追加されます。サービスを実行して WCF テスト クライアントを使用すると、追加された操作をEndpointBehavior実際に確認できます。Ping()この endpointbehavior を次のように実装しました。

構成:

<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);
    }

    ...
}

ただし、操作の動作は機能していません。operationbehaviorの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 でホストされているサービス (自己ホスト型ではない) で動作するはずです
  • 構成に動作を追加する (および動作を含むアセンブリを参照する) ことを除いて、サービスで何も変更する必要はありません。
4

1 に答える 1

-1

カスタム動作でも同じ問題がありました。WebHttpBehavior (IEndpointBehavior から継承) から派生していましたが、ApplyDispatchBehavior が呼び出されていませんでした。

私の問題の解決策は、次のような不足しているオーバーライド キーワードを追加することでした: public override void ApplyDispatchBehavior(...

于 2017-12-08T20:38:54.213 に答える