C#と諸々

C#がメインで他もまぁ諸々なブログです
おかしなこと書いてたら指摘してくれると嬉しいです(´・∀・`)
つーかコメント欲しい(´・ω・`)

2007/04/16 01:02
WCF では独自のビヘイビアを定義することができます。

【 独自のビヘイビア クラスを定義 】
ビヘイビアには、サービス ビヘイビア、エンドポイント ビヘイビア、コントラクトビヘイビア、オペレーションビヘイビアの4種類があります。
これらは、それぞれ利用できる適用方法が、以下のように異なります。
  • サービス ビヘイビア、エンドポイント ビヘイビアは、コンフィギュレーションで適用することができます。
  • コントラクト ビヘイビア、サービス ビヘイビア、オペレーション ビヘイビアは、プログラムでカスタム属性として適用することができます。
  • 全てのビヘイビアは、プログラムで ServiceHost オブジェクトをカスタマイズして適用することができます。

[ サービス ビヘイビア ]
IServiceBehavior インターフェイス (System.ServiceModel.Description) を実装したクラスで表されます。このインターフェイスには、以下の3つのメソッドが用意されています。

AddBindingParameters メソッド
ApplyDispatchBehavior メソッド
Validate メソッド


[ エンドポイント ビヘイビア ]
IEndopointBehavior インターフェイス (System.ServiceModel.Description) を実装したクラスで表されます。
このインターフェイスには、以下の4つのメソッドが用意されています。

AddBindingParameters
ApplyClientBehavior
ApplyDispatchBehavior
Validate


[ コントラクト ビヘイビア ]
IContractBehavior インターフェイス (System.ServiceModel.Description) を実装したクラスで表されます。このインターフェイスには、以下の4つのメソッドが用意されています。

AddBindingParameters メソッド
ApplyClientBehavior メソッド
ApplyDispatchBehavior メソッド
Validate メソッド


[ オペレーション ビヘイビア ]
IOperationBehavior インターフェイス (System.ServiceModel.Description) を実装したクラスで表されます。このインターフェイスには、以下の4つのメソッドが用意されています。

AddBindingParameters メソッド
ApplyClientBehavior メソッド
ApplyDispatchBehavior メソッド
Validate メソッド


各インターフェイスでは共通の名前のメソッドが用意されています。 ( IServiceBehavior のみ、ApplyClientBehavior メソッドが存在しません。 )

AddBindingParameters メソッド
バインディング要素にデータを追加するためのメソッドです。

ApplyClientBehavior メソッド
クライアントアプリケーションでカスタマイズを行うためのメソッドです。

ApplyDispatchBehavior メソッド
サービスアプリケーションでカスタマイズを行うためのメソッドです。

Validate メソッド
ビヘイビアを適用するための前提条件の検証を行います。


[ 実装について ]
ビヘイビア クラスを作成する場合、適切なインターフェイスを実装することになります。当然、独自のプロパティを用意することも可能です。
ビヘイビア クラスは、開発者がコードから直接操作することも想定されるため、インターフェイスは明示的に実装した方が良いかと思います。


[ 実装例 ]
以下に、サービス ビヘイビア クラスの実装例を示します。

using System;
using System.Collections.Generic;
using System.Text;
using System.Configuration;
using System.Collections.ObjectModel;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Configuration;
using System.ServiceModel.Description;
using System.ServiceModel.Dispatcher;

public sealed class HelloWorldBehavior : IServiceBehavior
{
    private bool silent;

    public bool Silent
    {
        get
        {
            return this.silent;
        }
        set
        {
            this.silent = value;
        }
    }

    public HelloWorldBehavior()
    {
        this.silent = false;
    }

    void IServiceBehavior.AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
    {
    }

    void IServiceBehavior.ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    {
        if (this.silent)
        {
            return;
        }

        serviceHostBase.Opened +=
            delegate
            {
                Console.WriteLine("Hello World !");
            };
    }

    void IServiceBehavior.Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    {
    }
}

このビヘイビアを設定すると、サービス ホストがオープンした時にコンソールへ "Hello World !" という文字列を出力するようになります。Silent プロパティが true に設定されている場合は、この動作を追加しません。


【 独自のビヘイビアをプログラムから ServiceHost に適用する 】
プログラムから ServiceHost に適用する場合、特別な処理は不要で、通常のビヘイビア設定方法と変わりません。コードでビヘイビアを設定する方法については以下の記事を参照してください。

C#と諸々 - WCFのホスティング


【  独自のビヘイビアをコンフィギュレーションで適用する 】
サービス ビヘイビア、エンドポイント ビヘイビアは、コンフィギュレーションから適用することができます。しかし、ビヘイビア クラスを定義しただけでは、コードからは扱えてもコンフィギュレーションで扱うことができません。コンフィギュレーションで扱うためには、拡張エレメントを定義する必要があります。

[ 拡張エレメント クラス ]
拡張エレメントを定義するには、 BehaviorExtensionElement クラス (System.ServiceModel.Configuration) の継承クラスを定義します。
BehaviorExtensionElement クラスには、以下の2つの抽象メンバが用意されています。

BehaviorType プロパティ
ビヘイビア クラスの型情報を返すように実装します。

CreateBehavior メソッド
ビヘイビア クラスのインスタンスを生成して返すように実装します。
この際、拡張エレメントの属性 ( 後述 ) で設定された値を、ビヘイビア クラスのインスタンスに反映させる必要があります。


[ 拡張エレメントの属性 ]
ビヘイビア クラスにプロパティを定義した場合、拡張エレメントでもそれを設定できるようにする必要があります。そのためには、拡張エレメント クラスにプロパティを用意して、ConfigurationPropertyAttribute クラス (System.Configuration) をプロパティの属性として付加する必要があります。


[ 実装例 ]
先ほどの例で定義した HelloWorldBehavior ビヘイビアを、コンフィギュレーションで扱うための拡張エレメント クラスの例を以下に示します。

using System;
using System.Collections.Generic;
using System.Text;
using System.Configuration;
using System.Collections.ObjectModel;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Configuration;
using System.ServiceModel.Description;
using System.ServiceModel.Dispatcher;

public sealed class HelloWorldElement : BehaviorExtensionElement
{
    public override Type BehaviorType
    {
        get
        {
            return typeof(HelloWorldBehavior);
        }
    }

    protected override object CreateBehavior()
    {
        HelloWorldBehavior result = new HelloWorldBehavior();
        result.Silent = this.Silent;
        return result;
    }

    [ConfigurationProperty("silent", DefaultValue = false)]
    public bool Silent
    {
        get
        {
            return (bool)base["silent"];
        }
        set
        {
            base["silent"] = value;
        }
    }

    private ConfigurationPropertyCollection properties;

    protected override ConfigurationPropertyCollection Properties
    {
        get
        {
            if (this.properties == null)
            {
                ConfigurationPropertyCollection propertys = new ConfigurationPropertyCollection();
                propertys.Add(new ConfigurationProperty("silent", typeof(bool), false, null, null, ConfigurationPropertyOptions.None));
                this.properties = propertys;
            }
            return this.properties;

        }
    }
}


[ コンフィギュレーションで適用 ]
独自のビヘイビアをコンフィギュレーションで適用する場合、 [ system.serviceModel ] - [ extensions ] セクションに、拡張エレメントを追加して、コンフィギュレーションで扱う際の名称を設定する必要があります。

先ほど定義した拡張エレメントを extensions セクションに追加する例を以下に示します。 ( アセンブリ名と拡張エレメントの名前空間は、共に "WCFCustomize" としました。 )

<extensions>
    <behaviorExtensions>
        <add name="helloWorld" type="WCFCustomize.HelloWorldElement, WCFCustomize, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
    </behaviorExtensions>
</extensions>

extensions セクションに拡張エレメントを追加すると、その際に name 属性に指定した名称をセクション名として、bihavior セクション内にて設定することが可能となります。
以下に、使用例を示します。

<behaviors>
    <serviceBehaviors>
        <behavior name="SampleBehavior">
            <helloWorld silent="false"/>
        </behavior>
    </serviceBehaviors>
</behaviors>

これで、独自のビヘイビアがサービスに適用されるようになりました。サービス ホストがオープンした時に "Hello World !" と出力されるはずです。 ( コンソールに出力されるので、コンソールアプリでセルフ ホスティングしてください。 )


【 独自のビヘイビアを属性として適用 】
以下の記事を参照してください。

C#と諸々 - 独自のビヘイビアを定義する 2

タグ: .NET C# WCF











トラックバックURL↓
http://csharper.blog57.fc2.com/tb.php/122-54585908