このエントリーをはてなブックマークに追加このエントリをつぶやく

silverlightで業務アプリ(ローカルメッセージ機能小ネタその2)

前回、Silverlightアプリと外部Webアプリと連携する方法として、ローカルメッセージによる連携を説明しました。
ということで、今回はサンプルコードを少々。
外部Webアプリとの連携を前提とした場合に考慮するべき点などを書きたいと思います。

なお、ローカルメッセージ機能自体については、MSDNの「Silverlight ベースのローカル アプリケーション間の通信」あたりを参考にしてください。

ローカルメッセージ機能はメッセージ、というくらいですから、送信する側と受信する側が存在します。
ということで、まずは受信する側から。今回の場合は、業務アプリ本体になります。
まずは初期化。


try{
LocalMessageReceiver receiver = new LocalMessageReceiver("AppName");
receiver.MessageReceived += new EventHandler(receiver_MessageReceived);
receiver.Listen();
}catch{}

はい、これだけです。アプリ本体の初期化が完了した後に上記コードを呼んで下さい。
LocalMessageReceiver(“AppName”);
の”AppName”はメッセージ送信先の識別子として使用されますので、アプリによって適当に指定してください。(”OrderAppWindow”など)

ちなみに同じ識別子を持つLocalMessageReceiverを複数生成することは出来ません。(生成時点で例外が投げられます)
これを利用して、注文画面のウィンドウが複数起動していても、連携用に動作するのは1つのウィンドウだけ、という形に制限することが出来ます。

初期化したら、後はメッセージを受信した際のイベントハンドラを書けばOKです。

private void receiver_MessageReceived(object sender, MessageReceivedEventArgs e)
{
string message = e.Message;
if(string.IsNullOrEmpty(message))
{
//メッセージ文字列が空だったらエラー処理
return;
}
//メッセージ文字列を元に行う処理を記述
}

実際は、商品コードなどをメッセージとして受信して、それを元にデータ読み込みなどを行うロジックを書く事になるかと思います。

これで受信側はOKです。次は送信側。これは外部のWebアプリからURLパラメータなりPOSTなりでアクセスされる連携用の小さいアプリになります。

まずは初期化。

sender = new LocalMessageSender("AppName");
sender.SendCompleted += new EventHandler(sender_SendCompleted);

受信側と同じく、画面の初期化処理の最後あたりで。
コンストラクタで指定する識別子は、連携する外部Webアプリから受け渡されるパラメータなどから、適切な物を指定してあげます(受信側と一致するものを指定します)。

ちなみに、sender変数はメッセージ送信時にクラス内からアクセスされるので、クラス変数として宣言してください。

protected readonly LocalMessageSender sender;

あとは、送信完了時のイベントハンドラを書いてあげます。

void sender_SendCompleted(object sender, SendCompletedEventArgs e)
{
if (e.Error != null)
{
//Errorがnullではない場合は、該当画面を起動してあげる
HtmlPage.Window.Navigate("http://", "target", "");
}
else
{
//メッセージ送信成功
}
}

この時にErrorオブジェクトがnullでなかった場合、受信側の業務アプリが起動していないとみなして業務アプリ自体を別ウィンドウで起動してあげるようにしています。
(実際はErrorオブジェクトの内容で処理を細分化することになります)

こうすることによって、外部Webアプリから連携時にSilverlightの業務アプリが起動していない時は自動で起動&連携し、起動済みの場合は高速に連携することが可能になり、使い勝手が良くなるかと思います。

ここまで来たら、後は、送信側で

this.sender.SendAsync("orderCode=12345");

という感じでメッセージ送信を実行してあげればOKです。

と、超駆け足でしたが、こんな感じでSilverlightアプリケーションの初期化処理を実行させずに外部Webアプリからデータを引き渡して連携する事が可能です。

カテゴリー: プログラミング   タグ:   この投稿のパーマリンク

コメントは受け付けていません。