次の方法で共有


手順 3: エコー アダプターの接続を実装する

手順 3/9

完了までの時間: 45 分

この手順では、エコー アダプターの接続機能を実装します。 WCF LOB アダプター SDK によると、ターゲット システムに接続するときに、次の抽象クラスとインターフェイスを実装する必要があります。

  • Microsoft.ServiceModel.Channels.Common.ConnectionUri

  • Microsoft.ServiceModel.Channels.Common.IConnection

  • Microsoft.ServiceModel.Channels.Common.IConnectionFactory

    アダプター開発ウィザードでは、上記の抽象クラスとインターフェイスから派生する代わりに、EchoAdapterConnection、EchoAdapterConnectionUri、EchoAdapterConnectionFactory の 3 つの派生クラスが自動的に生成されます。 クラスの作成に加えて、それぞれに特定の例外をスローする既定のメソッド ( System.NotImplementedException) があります。 このステートメントは、各クラスを実装するよう開発者に通知します。 クラスを実装するときは、この例外スロー ステートメントを削除する必要があります。

    次のセクションでは、これらの 3 つのクラスを更新して、接続の処理方法、URI 構造体の概要、およびさまざまな URI 要素をプログラムで取得し、アダプター内でそれらの要素を使用する方法について理解を深めます。

[前提条件]

この手順を開始する前に、「 手順 2: アダプターと接続のプロパティを分類する」を正常に完了している必要があります。 また、 Microsoft.ServiceModel.Channels.Common.IConnectionMicrosoft.ServiceModel.Channels.Common.IConnectionFactory、および Microsoft.ServiceModel.Channels.Common.ConnectionUri クラスを明確に理解している必要があります。

アダプター開発ウィザードでは、EchoAdapterConnection、EchoAdapterConnectionUri、EchoAdapterConnectionFactory の 3 つの派生クラスが生成されます。 次に、それぞれに関連付けられているメソッドの簡単な概要を示します。

エコーアダプター接続

アダプターの複雑さに応じて、次の 5 つのメソッドをすべて実装する必要があります。 Echo アダプターの場合、エコー アダプターのサンプルにはターゲット システムが含まれていないため、ほとんどはサポートされていません。

方式 説明
public void Close(TimeSpan timeout) ターゲット システムへの接続を閉じます。 エコー アダプターでは、このメソッドを使用してトレース リスナーにのみトレース イベントを追加します。
public bool IsValid(TimeSpan timeout) 接続がまだ有効かどうかを示す値を返します。

エコー アダプターではサポートされていません。
public void Open(TimeSpan timeout) ターゲット システムへの接続を開きます。

エコー アダプターの N/A。 ただし、この例では、enableAuthentication と呼ばれる URI 要素を使用して、ユーザーにユーザー名の指定を要求する方法を示します。
public void ClearContext() 接続のコンテキストをクリアします。 このメソッドは、接続が接続プールに戻るときに呼び出されます。

エコー アダプターではサポートされていません。
パブリック メソッド void Abort() ターゲット システムへの接続を中止します。

エコー アダプターではサポートされていません。

Echoアダプターコネクションファクトリー

接続ファクトリは、接続の作成を担当します。 既定では、ターゲット システムに接続する場合にのみ、このクラスを変更する必要があります。 エコー アダプターにはターゲット システムは含まれませんが、接続にユーザー認証が必要な場合に enableAuthentication というカスタム URI 要素を使用する方法が示されています。

enableAuthentication はキーワードではなく、単なる変数名です。 そのため、任意の名前を選択できます。

EchoAdapterConnectionUri

これは、ターゲット システムへの接続文字列を表します。

方式 説明
パブリック オーバーライド URI URI Uri を取得および設定します。 Uri 文字列を作成し、Uri 文字列を解析するように設定します。
public EchoAdapterConnectionUri() ConnectionUri クラスの新しいインスタンスを初期化します。
public override string SampleUriString EchoAdapter.SCHEME + "://{hostname}/{application}?enableAuthentication={True|False}" の形式です。

この戻り値の文字列は、次の図に示すように、アダプター サービス参照プラグインの追加ツールの として表示されます。

[アダプター サービスの追加] ダイアログ ボックスを示すスクリーンショット。

エコー アダプター接続 URI

サンプルのエコー アダプター接続 URI は、EchoAapter.SCHEME://{hostname}/{application}?enableAuthentication={true|false} と記述されています。

EchoAapter.SCHEME は echov2 であるため、接続 URI は次のとおりです。

echo2://lobhostname/lobapplication?enableAuthentication={true|false}

enableAuthentication=false の場合は、次のように前の接続 URI を読み取ることができます。

echov2 トランスポート スキーマを使用して、lobhostname という名前のコンピューターに移動します。ここで、認証を必要としない lobapplication という名前のアプリケーションが接続を待機しています。

または、enableAuthentication=true の場合は、次のように接続を読み取ってください。

echov2 トランスポート スキーマを使用して、lobhostname という名前のコンピューターに移動します。lobapplication という名前のアプリケーションでは、認証が接続を待機していると想定されます。 Echo アダプターの場合は、ユーザー名のみが必要です。

定義された URI を使用すると、プログラムで使用して解析し、接続と構成を行うことができます。 接続にユーザー名やパスワードなどの機密データが必要な場合は、URI にそのような情報を含めないでください。 代わりに、このような情報を System.ServiceModel.Description.ClientCredentials オブジェクトに追加します。 追加するコード例は、その方法を示しています。

次のコードでは、エコー アダプターは、アダプターがさまざまな URI 要素を使用してアダプター機能を変更する方法を示す 2 つの方法で URI を構築します。

echo2://lobhostname/lobapplication?enableAuthentication=[true|false]

echo2://lobhostname/lobapplication?enableAuthentication=[true|false]&echoInUpperCase=true

URI 要素の取得

Echo アダプター URI echo2://lobhostname/lobapplication?enableAuthentication=false>echoInUpperCase=false の各 URI 要素を解析できます。 URI 要素の値と関連するメソッドを次の表に示します。

URI 要素の値 方式
lobhostname System.Uri.Host%2A ホスト名を取得するには
Lobapplication System.Uri.AbsolutePath%2A ターゲット アプリケーション名を取得するには
enableAuthentation=false GetQueryStringValue("enableAuthentication")

この URI 要素を使用してユーザーの資格情報を検証します。注: GetQueryStringValue は、Microsoft.ServiceModel.Channels.Common.ConnectionUriに定義されている静的メソッドです。
echoInUpperValue=false GetQueryStringValue("echoInUpperValue")

この URI 要素を使用して、受信文字列を大文字に変換します。

EnableAuthentication URI 要素

ターゲット システムでは、多くの場合、ターゲット システムへの接続を確立するためにクライアント資格情報を指定する必要があります。 前述のように、エコー アダプターにはターゲット システムは含まれません。 サンプルとして、enableAuthentication と呼ばれるカスタム URI 要素を使用して資格情報を提供する方法を示します。

 public class EchoAdapterConnection : IConnection   
{  
….  
   public void Open(TimeSpan timeout)  
  {  
    // only validate the credentials if EnableAuthentication  
    // connection property value is true  
    if (this.ConnectionFactory.ConnectionUri.EnableAuthentication)  
    {  
        // this adapter expects a value in username  
        if (this.connectionFactory.ClientCredentials != null &&  
            string.IsNullOrEmpty(this.connectionFactory.ClientCredentials.UserName.UserName))  
        {  
            throw new CredentialsException("Username is expected.");  
        }  
  }  
}  

このコードは、enableAuthentication が true であり、ユーザー名が指定されていない場合を確認します。ユーザー名が指定されていない場合、例外がスローされ、それが次に示すようにアダプター サービス参照プラグインの追加ツールによってキャッチされます。

ユーザー名が指定されていない場合にスローされる例外を示すスクリーンショット。

ユーザー名を指定するには、次の図に示すように、アダプター サービス参照プラグインの追加ツールの [アダプターの構成] ダイアログ ボックスに入力します。

[アダプターの構成] ダイアログ ボックスを示すスクリーンショット。

EchoInUpperCase URI 要素

EchoInUpperCase URI 要素は、ブール型フラグのように参照できます。 フラグが true の場合、アダプターは EchoStrings 操作の入力文字列を大文字に変換します。

echoInUpperCase URI 要素の既定値を変更するには、次に示すように、[アダプター サービス参照の追加] プラグインの [アダプターの構成] の [URI プロパティ] タブを使用します。

EchoInUpperCase URI 要素を示すスクリーンショット。

EchoAdapterConnection の更新

EchoAdapterConnection クラスの IsValid、Open、Close メソッドを実装します。

EchoAdapterConnection クラスを更新するには

  1. ソリューション エクスプローラーでEchoAdapterConnection.cs ファイルをダブルクリックします。

  2. Visual Studio エディターで、エディター内の任意の場所を右クリックし、コンテキスト メニューで [ アウトライン] をポイントし、[ アウトラインの停止] をクリックします。

  3. Visual Studio エディターで、 IsValid メソッドを見つけます。 IsValid メソッド内で、既存の実装を次のものに置き換えます。

    return true;  
    
  4. Visual Studio エディターで、 Open メソッドを見つけます。 Open メソッド内で、既存の実装を次の実装に置き換えます。 ここでは、URI enableAuthentication 要素を使用して、ユーザー名が指定されていることを確認する方法を示します。

    // only validate the credentials if EnableAuthentication  
    // connection property value is true  
    if (this.ConnectionFactory.ConnectionUri.EnableAuthentication)  
    {  
        // this adapter expects a value in username  
        // it just logs the credentials in the trace file  
        if (this.connectionFactory.ClientCredentials != null &&  
            string.IsNullOrEmpty(this.connectionFactory.ClientCredentials.UserName.UserName))  
        {  
            throw new CredentialsException("Username is expected.");  
        }  
        // got the username, log it in trace file  
        EchoAdapterUtilities.Trace.Trace(System.Diagnostics.TraceEventType.Information, "EchoAdapterConnection::Open", "Username is " + this.connectionFactory.ClientCredentials.UserName.UserName);  
    }  
    EchoAdapterUtilities.Trace.Trace(System.Diagnostics.TraceEventType.Information, "EchoAdapterConnection::Open", "Connection successfully established!");  
    
  5. Visual Studio エディターで、 Close メソッドを見つけます。 Close メソッド内に、次の単一ステートメントを追加します。

    EchoAdapterUtilities.Trace.Trace(System.Diagnostics.TraceEventType.Information, "EchoAdapterConnection::Close", "Connection successfully closed!");  
    

EchoAdapterConnectionFactory の更新

EchoAdapterConnectionFactory コンストラクターを実装し、ClientCredentials と ConnectionUri という 2 つのプロパティを追加します。

EchoAdapterConnectionFactory クラスを更新するには

  1. ソリューション エクスプローラーでEchoAdapterConnectionFactory.cs ファイルをダブルクリックします。

  2. Visual Studio エディターで、エディター内の任意の場所を右クリックし、コンテキスト メニューで [ アウトライン] をポイントし、[ アウトラインの停止] をクリックします。

  3. Visual Studio エディターで、[ プライベート フィールド] 領域を見つけます。 次の単一のステートメントを追加します。

    private EchoAdapterConnectionUri connectionUri;  
    

    プライベート フィールドの一覧は、次と一致する必要があります。

    // Stores the client credentials  
    private ClientCredentials clientCredentials;  
    // Stores the adapter class  
    private EchoAdapter adapter;  
    private EchoAdapterConnectionUri connectionUri;  
    
  4. Visual Studio エディターで、 EchoAdapterConnectionFactory メソッドを見つけます。 EchoAdapterConnectionFactory コンストラクター メソッド内の "}" の前に、次の単一ステートメントを最後のステートメントとして追加します。

    this.connectionUri = connectionUri as EchoAdapterConnectionUri;  
    

    EchoAdapterConnectionFactory メソッドの実装は、次と一致する必要があります。

    /// <summary>  
    /// Initializes a new instance of the EchoAdapterConnectionFactory class  
    /// </summary>  
    public EchoAdapterConnectionFactory(ConnectionUri connectionUri  
        , ClientCredentials clientCredentials  
        , EchoAdapter adapter)  
    {  
        this.clientCredentials = clientCredentials;  
        this.adapter = adapter;  
        //added  
        this.connectionUri = connectionUri as EchoAdapterConnectionUri;  
    }  
    
  5. Visual Studio エディターで、[ パブリック プロパティ ] 領域を見つけます。 次のコードを追加します。

    /// <summary>  
    /// Returns the client credentials  
    /// </summary>  
    public ClientCredentials ClientCredentials  
    {  
        get  
        {  
            return this.clientCredentials;  
        }  
    }  
    
    /// <summary>  
    /// Returns the Connection Uri for this adapter  
    /// </summary>  
    public EchoAdapterConnectionUri ConnectionUri  
    {  
        get  
        {  
            return this.connectionUri;  
        }  
    }  
    

EchoAdapterConnectionUri の更新

EchoAdapterConnectionUri の既定のコンストラクター、EchoAdapterConnectionUri(Uri) オーバーロードコンストラクター、およびパブリック オーバーライド URI プロパティを実装します。

EchoAdapterConnectionUri クラスを更新するには

  1. ソリューション エクスプローラーでEchoAdapterConnectionUri.cs ファイルをダブルクリックします。

  2. Visual Studio エディターで、エディター内の任意の場所を右クリックし、コンテキスト メニューで [ アウトライン] をポイントし、[ アウトラインの停止] をクリックします。

  3. Visual Studio エディターで、 コンストラクター領域を 見つけます。 EchoAdapterConnectionUri() の既定のコンストラクター内に、次のステートメントを追加します。

    Uri = new Uri("echov2://lobhostname/lobapplication?enableauthentication=False");  
    
  4. Visual Studio エディターで、 EchoAdapterConnectionUri(Uri) オーバーロードコンストラクター内に、次のステートメントを追加します。

    Uri = uri;  
    

    EchoAdapterConnectionUri(Uri) メソッドの実装は、次と一致する必要があります。

    public EchoAdapterConnectionUri(Uri uri)  
        : base()  
    {  
        Uri = uri;  
    }  
    
  5. Visual Studio エディターの パブリック オーバーライド URI メソッド内で、既存のものを次のロジックに置き換えます。 get は、echoInUpperCase を使用するか、含まない URI をビルドします。 セットは URI を解析して、ホスト名、データベース名、およびクエリ値を取得します。

    get  
    {  
        // Build the uri  
        if (String.IsNullOrEmpty(this.hostname)) throw new InvalidUriException("Invalid target system host name.");  
        if (String.IsNullOrEmpty(this.application)) throw new InvalidUriException("Invalid target system data source name.");  
        if (EchoInUpperCase)  
        {  
            // build the uri with echoInUpperCase= query string  
            return new Uri(EchoAdapter.SCHEME + "://" + Hostname + "/" + Application + "?" + "enableAuthentication=" + EnableAuthentication + "&" + "echoInUpperCase=" + echoInUpperCase);  
        }  
        else  
        {  
            // build the uri without echoInUpperCase= query string  
            return new Uri(EchoAdapter.SCHEME + "://" + Hostname + "/" + Application + "?" + "enableAuthentication=" + EnableAuthentication);  
        }  
    }  
    set  
    {  
        // Parse the uri  
        String[] enableAuthValue = GetQueryStringValue(value, "enableAuthentication");  
        if (enableAuthValue.Length > 0) this.enableAuthentication = Boolean.Parse(enableAuthValue[0]);  
        String[] echoInUpperValue = GetQueryStringValue(value, "echoInUpperCase");  
        if (echoInUpperValue.Length > 0) this.echoInUpperCase = Boolean.Parse(echoInUpperValue[0]);  
    
        this.hostname = value.Host;  
        String[] applicationValue = value.AbsolutePath.Split('/');  
        if (applicationValue.Length > 1) this.Application = applicationValue[1];  
    }  
    
  6. Visual Studio の [ ファイル ] メニューの [ すべて保存] をクリックします。

  7. [ビルド] メニューの [ソリューションのビルド] をクリックします。 プロジェクトを正常にコンパイルする必要があります。 そうでない場合は、上記のすべての手順に従っていることを確認します。

作業を保存しました。 この時点で Visual Studio を安全に閉じるか、次の手順「 手順 4: エコー アダプターのメタデータ参照ハンドラーを実装する」に進むことができます。

私は何をしましたか?

エコー アダプターの接続を実装しました。 WCF LOB アダプター SDK の接続コンポーネント、接続 URI の基本的な構造、URI 要素をプログラムで解析する方法、URI 要素を使用してアダプター機能を変更する方法について説明しました。

次のステップ

メタデータの参照、検索、解決機能、および送信メッセージ交換を実装します。 最後に、アダプターをビルドして展開します。

こちらもご覧ください

手順 4: エコー アダプターのメタデータ参照ハンドラーを実装する
チュートリアル 1: エコー アダプターを開発する