簡體   English   中英

WCF OperationBehavior:未調用ApplyDispatchBehavior

[英]WCF OperationBehavior: ApplyDispatchBehavior not being called

我的目標是為WCF創建endpointbehavior,它會向現有合同添加額外的Ping()操作。 EndpointBehavior運行正常,當我運行我的服務並使用WCF測試客戶端時,我實際上可以看到添加的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);
    }

    ...
}

操作行為但是, 工作。 操作行為上的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中托管的服務(非自托管)
  • 除了在配置中添加行為(以及引用包含行為的程序集)之外,我不想在服務上更改任何內容

我的自定義行為也遇到了同樣的問題。 我是從WebHttpBehavior派生的(它繼承自IEndpointBehavior),但是沒有調用ApplyDispatchBehavior。

我的問題的解決方案是添加缺少的覆蓋關鍵字,如:public override void ApplyDispatchBehavior(...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM