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

前回(Visual Studio 2008からRDSサービスを作成(4)(失敗編3)
)からの続きです。


解決しました。(≧▽≦)


なんのことはない、単なる私の勘違いでした。。。σ(^-^;)
お恥ずかしいので前のエントリ、全部消しちゃいたいくらいなのですが、
もしかしたらおんなじところではまる人がい(ないだろうな。。。)るかもしれないので
どこを間違えてたか、さらに恥の上塗りしてみます。。。


  • 間違えてた箇所

【1箇所目】

  1. Replaceクラスの作成

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

    /// <summary>
    /// AddPortTest Replace operation
    /// </summary>
    public class Replace : Replace<GetRequestType, PortSet<AddPortTestState, Fault>>
    {
    }

正しくは

    /// <summary>
    /// AddPortTest Replace operation
    /// </summary>
    public class Replace : Replace<AddPortTestState, PortSet<DefaultReplaceResponseType, Fault>>
    {
    }

【2箇所目】

  1. ハンドラの追加

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

ビルドをしたら

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

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

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

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

こんなエラーが出たので、いろいろコメントアウトしたり余計なことをしてましたが、最初の状態が正解です。
余計な手を加えたほう

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

正しくは

        /// <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;
        }

【3・4箇所目】
そして、[DataMember]の追加と初期化を忘れてました。

  /// <summary>
    /// AddPortTest state
    /// </summary>
    [DataContract]
    public class AddPortTestState
    {
        [DataMember]
        public double ChangeValue
        { get; set; }
    }
        /// <summary>
        /// Service constructor
        /// </summary>
        public AddPortTestService(DsspServiceCreationPort creationPort)
            : base(creationPort)
        {
            _state.ChangeValue = 0.0;
        }

これらが指定されていなくてもビルド時にエラーはでないので実行できてしまうのですが、書き換えたいデータ自体を宣言(?)していないので欲しい実行結果が得られません。



再度、ソリューションのビルドをして、VPL図を作り直します。

今回、何がしたかったかというと、

「AddPortTest」ブロックを使ってChangeValueを「Data」ブロックに入力した値で書き換える。

です。

実行すると最初のDataブロックで指定した「0.5」という値に書き換わっていることが確認できます。



参考URL