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