Visual Studio 2008からRDSサービスを作成(4)(成功編)
前回(Visual Studio 2008からRDSサービスを作成(4)(失敗編3)
)からの続きです。
解決しました。(≧▽≦)
なんのことはない、単なる私の勘違いでした。。。σ(^-^;)
お恥ずかしいので前のエントリ、全部消しちゃいたいくらいなのですが、
もしかしたらおんなじところではまる人がい(ないだろうな。。。)るかもしれないので
どこを間違えてたか、さらに恥の上塗りしてみます。。。
- 間違えてた箇所
【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箇所目】
- ハンドラの追加
プロジェクト名.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