Visual Studio 2008からRDSサービスを作成(4)(失敗編)

前回の「Visual Studio 2008からRDSサービスを作成(3)」ではプロジェクトの新規作成時に指定したテンプレート『DSS Service(2.0)』にあらかじめ準備されていた「Get」メッセージを使用してみました。
今回はテンプレートに含まれてはいませんが、RDSに定義されているReplaceという値を置き換えるメッセージをプログラム上に追加する方法をやってみます。
これにはポートの追加という手順が必要になってきます。

現在、試行錯誤の状態なので、これは失敗した例をのせている点にご注意下さい。

  • 事前準備

プロジェクトの新規作成からマイテンプレートで『DSS Service(2.0)』を選択してプロジェクト名を入力後、OKボタンを押すと

  1. プロジェクト名Types.cs
  2. プロジェクト名.cs
  3. プロジェクト名.manifest.xml

の3種類のファイルが作成されます。
今回は「AddPortTest」というプロジェクト名にしました。

  1. PortSetの追加

プロジェクト名Type.csの中の「プロジェクト名Operations関数」を以下のように書き換えます。

  • 修正前
    /// <summary>
    /// AddPortTest main operations port
    /// </summary>
    [ServicePort]
    public class AddPortTestOperations : PortSet<DsspDefaultLookup, DsspDefaultDrop, Get, Subscribe>
    {
    }
  • 修正後
    /// <summary>
    /// AddPortTest main operations port
    /// </summary>
    [ServicePort]
    public class AddPortTestOperations : PortSet<DsspDefaultLookup, DsspDefaultDrop, Get, Subscribe, Replace>
    {
    }
  1. Replaceクラスの作成

プロジェクト名Type.csにReplaceクラスを追加します。

    /// <summary>
    /// AddPortTest Replace operation
    /// </summary>
    public class Replace : Replace<GetRequestType, PortSet<AddPortTestState, Fault>>
    {
    }
  1. ハンドラの追加

プロジェクト名.csにReplaceのハンドラを追加します。

        /// <summary>
        /// Replace Handler
        /// </summary>
        /// <param name ="replace"></param>
        /// <reteuns></returns>
        [ServiceHandler(ServiceHandlerBehavior.Exclusive)]
        public virtual IEnumerator<ITask> ReplaceHandler(Replace replace) 
        {
            _state = replace.Body;
            replace.ResponsePort(DefaultReplaceResponseType.Instance);
            yield break;
        }

そしてビルドが正常終了したら、VPLを起動して上記で作成したサービス(今回はAddPortTest)をService欄から呼び出し、Dataブロックと接続してみる予定だったのですが、ここでコンパイルエラーの発生です。。。


  • エラーメッセージ
    • 73行目(_state = replace.Body;の部分)

型'Microsoft.Dss.ServiceModel.Dssp.GetRequestType'を型'AddPortTest.AddPortTestState'に暗黙的に変換できません。

    • 74行目(replace.ResponsePort(DefaultReplaceResponseType.Instance);の部分)

実行不可能なメンバ
'Microsoft.Dss.ServiceModel.Dssp.DsspOperation>.ResponsePort'をメソッドのように使用することはできません。

これから原因、追究します。