2009年09月30日

ウェブブラウザからSilverlightへのセッション(クッキー)の引き継ぎ方法について

Webアプリケーションを開発している場合、ログイン状態やログインユーザのデータを保持するために、ほとんどの場合セッション(厳密にはクッキー)を用いると思います(PCからウェブブラウザを用いたアクセスの場合)。
Webアプリケーションの一部機能をSilverlightを用いる場合、Webアプリケーションのサーバとウェブブラウザ間で利用しているセッションをSilverlightに対して引き継ぐ必要があります。なぜなら、引き継がない場合、Silverlight側で再度ログインする必要があるため、ユーザビリティが低下するため。

では、どうやって引き継ぐのでしょうか?答えは簡単です。

『何もしなくてもよい!』


SilverlightからWeb(Http)アクセスをする場合、主に

 ・WebClient
 ・HttpWebRequest
 ・Webサービスへアクセスするための自動生成されたクラス

クラスを使用すると思いますが、デフォルトでは、全てのクラスにおいてSilverlightをホストしているウェブブラウザとセッションを共有するようです。

Webアクセスするために上記クラスを何度newしても、また別クラスをnewしても同じセッションが共有されます。
当然、Silverlightからアクセスしたサーバ側でセッションを操作した場合、Silverlightをホストしているウェブブラウザにも操作が反映されます。

要するに、SilverlightからのWebアクセスは、Silverlightをホストしているウェブブラウザを通して行われることになります。

自分は、これに気付かずに、かなりの時間悩んでしまいました。


逆に、ウェブブラウザとセッション(クッキー)を共有したくない場合、どうすればよいのでしょうか?

「WebRequest」クラスには、staticなメソッドとして、RegisterPrefix()が用意されており、この第2引数に、「System.Net.Browser.WebRequestCreator.ClientHttp」を指定します。

コード例)
IWebRequestCreate creator = System.Net.Browser.WebRequestCreator.ClientHttp;
WebRequest.RegisterPrefix("http://", creator);
WebRequest.RegisterPrefix("https://", creator);


※ほかにも方法があるかもしれませんが、自分が調べて確認できた方法は、上記方法だけでした。

上記コードを1度実行すると、その後作成する、
 ・WebClient
 ・HttpWebRequest
 ・Webサービスへアクセスするための自動生成されたクラス
クラスは、全てウェブブラウザとクッキーを共有しません。
また、上記クラスをnewするだけでは、新たにnewしたオブジェクト同士でもクッキーは共有されません。

オブジェクト間でクッキーを共有するためには、
オブジェクトのCookieContainerプロパティを呼び出して、同一のCookieContainerオブジェクトをセットする必要があります。
ただし、WebClientにはCookieContainerオブジェクトをセットできないのと、「Webサービスへアクセスするための自動生成されたクラス」でCookieContainerプロパティを呼び出すと例外が発生してしまい、HttpWebRequestのみまともに使用できました。
なぜ例外が発生するかまで原因を突き止めることができませんでしたm(__)m

この状態を元に戻すには、RegisterPrefix()に「System.Net.Browser.WebRequestCreator.BrowserHttp」を指定します。
問題点として、現在どちらが指定されているか取得する方法がないので、あまり想定できませんが、同一アプリケーション内で切り替えて処理を行う場合、現在どちらを指定しているかを保持するフラグを用意したほうがよいと思います。


Silverlight⇔ウェブブラウザとのセッション(クッキー)の共有方法について、まとまった資料がなかったため、今回エントリーにしました。
(デフォルトで共有されているため、当り前なのかも知れません(>_<)


最後に、今回のことを調べる上で参考にしたページを挙げておきます。
Silverlight による HTTP 通信とセキュリティ
・ClientHttpとBrowserHttpを指定した時の動作の違いが記載されています。

Silverlight:ブラウザーまたはクライアントによる HTTP 処理を指定する

Silverlight:Cookie の取得と設定を行う
posted by しおしおプログラマ〜 at 01:11 | Comment(2) | TrackBack(0) | Silverlight

2009年09月25日

アウト オブ ブラウザ (Out of Browser)

今回は、Silverlight 3 の新機能であるアウトオブブラウザについて説明したいと思います。
アウトオブブラウザについて簡単に説明すると、Silverlightにおけるブラウザー外実行環境の提供です。

アウトオブブラウザ機能を有効にする方法は、VS2008の場合、
Silverlight3プロジェクトを[右クリック]→[プロパティ]を選択するか、
VS2008のメニューにある[プロジェクト]→[プロパティ]を選択してください。
次に、Silverlightタブ(1番上、デフォルトで選択されています)を選択します。

outobbrowser.jpg

Silverlightプロジェクトの設定画面が開いたら、「アプリケーションのブラウザー外実行を有効にする」にチェックをつけます。
これで、Silverlightを右クリックした時に表示されるメニューに「このコンピュータに○○をインストールします」というメニューが表示されるようになります。

さらに詳細な設定は、【ブラウザー外実行の設定】ボタンを押下して表示される設定画面にて可能です。
設定内容については、
『MSDN:方法: ブラウザー外実行サポート用にアプリケーションを構成する』
に説明があります。

前回のエントリにも記載した通り、ライフゲームにもアウトオブブラウザを実装予定ですが、アウトオブブラウザ状態の詳細設定をもう少しきめ細かく出来たらなと思います。
例えば、ウィンドウサイズの固定や最大化の制限など。
この辺りは、アウトオブブラウザの実現方法にも起因しているのかも知れませんね。
アウトオブブラウザの実現方法や、その他アウトオブブラウザの情報については、こちらに詳しい情報がありました。

ただ、この機能、このままで終わるとは思えないので、次バージョン以降も期待したいですね。
posted by しおしおプログラマ〜 at 00:17 | Comment(0) | TrackBack(0) | Silverlight

2009年09月18日

Silverlightでライフゲーム (5)

Expression Blend 3 の日本語版が公開されたということで、以前作っていたライフゲームをSilverlight3で作成してみました。(ただリコンパイルしただけですが(;´Д`))



とは言え、ただリコンパイルしただけでは面白くないので、機能を追加しました。
新機能では、マウスクリックで自分の好きなところにライフを配置できます。
これにより少し大変ですが、有名なライフゲームの配置等試すことが可能になります。

次回では、Silverligth3の新機能である「アウトオブブラウザ」、「SaveFileDialog」を利用した状態保存機能を実装したいと思います。
これで、ライフゲーム開発は一段落かな(^^;
posted by しおしおプログラマ〜 at 23:02 | Comment(0) | TrackBack(0) | Silverlight

2009年09月16日

Silverlight 3 Tools インストール時の致命的エラー & その他もろもろ

一部環境下(自分の環境?)だけかと思いますが、Silverlight 3 Tools インストール時に致命的エラーが発生します。

エラーが発生した環境構築手順は以下です。

1.VS2008インストール
2.VS2008 SP1 インストール
3.Blend2 インストール
4.Blend2 SP1 インストール
5.Silverlight 2 tools インストール
※ここで、Silverligth2の開発環境が構築された

6.Silverlight 3ランタイム インストール
7.Expression Studio 3 インストール
8.Silverlight 3 tools インストール
※9で致命的エラー発生

全てを連続して行ったわけではないので、うろ覚えです。

Silverlight 3 toolsは、ココから入手。

致命的エラーが発生すると、VSからSilverlightプロジェクトが作成できなくなります。

この時は、深く原因を追うことなく、VS2008、Expression Studio3、Blend2およびそれらに付随するものをアンインストール後、再インストール(3〜6はインストールしない)することで、Silverlight 3 toolsをインストールすることができました。

結局、何が悪いのか分かりませんが、Silverlight2関係(特にSilverlight 2 tools)があやしいと思い、ほぼ同じ環境下にあった別PCでは、
・Blend2 アンインストール
・Silverlight 2 tools アンインストール
・Silverlight 3ランタイム アンインストール
を実行後、Silverlight 3 tools のインストールを行い、無事成功しました。

致命的エラーが発生してからも、上記を行えば成功したかもしれませんね。


ここで、無事インストールが成功し、Silverlight3プロジェクトをVSから作成できるようになり喜んでいましたが、別の問題を発見しました。

VSのソリューションエクスプローラーからプロジェクトやxamlファイルを右クリックすると、以前はメニューに「Blendで開く」という項目があった気がしますが、なくなっています。
また、Blend3からボタンのClickイベント用関数を追加しても、VSが開かず、Blend内でソースが表示されます。

これが仕様なのか、それともSilverlight 3 toolsが、実はBlend3の日本語版に対応していないのか分かりませんが、前バージョンの挙動から変更され、微妙に使いにくいです。(すぐ慣れるのかもしれませんが。。。)
もし、この現象が不具合且つ修正方法をご存知の方がいらっしゃいましたら、ぜひともご連絡をお願いしますm(__)m。


以上、今回は長々と書きましたが、誰かの助けになれば幸いです。




posted by しおしおプログラマ〜 at 01:56 | Comment(1) | TrackBack(0) | Silverlight

2009年09月14日

Expression 3 日本語版公開

遅ればせながらですが、
http://www.microsoft.com/japan/products/expression/archive/20090910_ex3jp.aspx
Expression 3 の日本語版が Subscription 向けに公開されましたね。

というわけで、再度 Silverlight 3の開発環境をまとめたいと思います。

・Visual Studio 2008 SP1 + Silverlight 3 Tools
・Visual Web Developer 2008 Express SP1 + Silverlight 3 Tools
・Expression Blend 3

Silverlight 3 Toolsは
こちらよりダウンロード可能です。

最後に、今頃感バリバリですが、Silverlight3の新機能紹介記事を挙げておきます。
Silverlight 3、ここがすごい!

自分的には、『Perspective 3D』がすごく気になりますね。
posted by しおしおプログラマ〜 at 23:42 | Comment(0) | TrackBack(0) | Silverlight

2009年06月21日

Silverlightでライフゲーム (4)

基本的な機能の実装が全て完了しました\(^o^)/。



前回からの変更点は、
・フルスクリーン機能の実装
・壁有り/壁無し選択の実装
です。

フルスクリーン機能は、Silverlightをフルスクリーンモードに切り替え出来ます。
壁有り/壁無し機能では、壁をなくすことにより、上下/左右の端と端をつなげることができます。

『注意事項』
通常表示⇔フルスクリーン表示切り替え時に、切り替えに時間がかかります。原因は、大量のコントロールを動的に追加・削除しているからだと思われますが、解決策は今のところありません。。。
posted by しおしおプログラマ〜 at 00:24 | Comment(0) | TrackBack(0) | Silverlight

2009年06月15日

Silverlightでライフゲーム (3)

前回から、かなり時間が経ちましたが第2弾を作成しましたので、公開します。
ソースコードも公開中!



前回からの変更点は、
・Startボタンの実装
・Stopボタンの実装
・1Stepボタンの実装
・Resetボタンの実装
・総経過ターン数の表示
です。

実装自体はもっと前に出来ていたのですが、コピペを駆使してやっつけで実装したためソースコードがかなり見づらく、人前にさらしていけないと思い、内部構造を大きく変更&コメント記入したため、公開が遅くなりました。

内部構造については、こんな小さいプログラムではあまり意味はないですが、純粋なライフゲームエンジン箇所と描画箇所をなるべく独立するように設計しております。
が、そのため多少冗長になっています。
posted by しおしおプログラマ〜 at 01:22 | Comment(0) | TrackBack(0) | Silverlight

2009年06月10日

Silverlightでの描画処理について

Windowsでゲームのような常に描画を行う必要があるものをプログラミングする際は、(少々乱暴な言い方ですが)メッセージループ内に描画処理を入れ、メッセージ処理をしていない時に常に処理を行うのが一般的だと思います。

しかしSilverlightでは、メッセージループを自前で実装することができません。アニメーションするだけなら、Silverlightが処理してくれるので良いのですが、ゲームを作る場合そうはいきません。
ではどうすればよいでしょうか?
その答えをまとめてくれている方がいますので御紹介。
http://bygzam.seesaa.net/article/110314846.html

お勧めとして、「Renderingイベント」を挙げておられますが、今回作ったライフゲームではDispatcherTimerを用いました。
理由としては、ライフゲームの1ターンを1フレームとしたため、FPSを押さえて一定に保つ必要があり、ループ間隔を指定できるDispatcherTimerを使いました。
本当であれば、Renderingイベントを使用して、中でSleep処理をしたほうがよいのでしょうが、楽しました。

Storyboadについては、スマートな感じがしなかったので敬遠しました。


Silverlightには、この他にも System.Threading.Timer というのがあります。
ただし、これを使用するとマルチスレッド化(通常動作とコールバック関数が別スレッドで動作)してしまいます。
マルチスレッド化は非常に強力ですが、クラスメンバへのアクセス方法に工夫が必要だったりと、マルチスレッドを意識したコーディングを行う必要があり、使用には注意が必要です。
posted by しおしおプログラマ〜 at 23:42 | Comment(0) | TrackBack(0) | Silverlight

2009年06月08日

Silverlightでライフゲーム (2)

とりあえず動作するものを作ってみました。



ほとんどが未完成部分で、なんとか動いている感じです。

ただ前回から予告通り、ソースコードも公開しております。
もしかすると参考になる部分があるかもしれません。

今後、もっと作りこんでいく予定です。
posted by しおしおプログラマ〜 at 23:49 | Comment(0) | TrackBack(0) | Silverlight

2009年06月07日

Silverlightでライフゲーム (1)

なぜ急にSilverlightを取り上げたのか?
自分的には急ではなく、以前からちょくちょくと調べていました。
それは本格的なRIAを勉強したかったからです。

RIAというとFlush(FLex)になりますが、開発環境や開発言語への習熟度からSilverlightを選択しました。
情報量は圧倒的に少ないですが、逆に言えばスタートラインはみんな同じだし、今から勉強すればアドバンテージがあるかと思ったので。。。(^^;

というわけで、Silverligthを勉強するにあたり、何か作ろうと考えてライフゲームにしました。

これは、最近人工生命の話題を目にしたのと、自分が昔から人工生命に興味があり、それらに関する何かを作りたいと考えた時に、まずはライフゲームからだろうと思ったからです。

今後、ライフゲーム作成の過程をソースコード付きで報告していきたいと思います。
posted by しおしおプログラマ〜 at 14:11 | Comment(0) | TrackBack(0) | Silverlight

2009年06月06日

Silverlight3 まとめ

昨日に引き続きまして、今日は今年の3/18にβ版が公開されたSilverlight3についてです。
正式版は7/10公開予定だそうです。
Silverlight、毎年毎年新しいバージョンを公開して、力入れてますよね。ただ、正直最新の技術についていけませんよMSさん。

こちらも既に開発環境をまとめているかたがいらっしゃいますね。
 http://d.hatena.ne.jp/Yamaki/20090319/1237431646
  MSエバンジェリストの大西さんのブログです。
その他、
 http://koguma.cocolog-nifty.com/koguma/2009/03/silverlight-3-7.html
 http://techbank.jp/Community/blogs/maro/archive/2009/03/21/5532.aspx
 http://d.hatena.ne.jp/Yamaki/20090319/1237431646
などがあります。

一応自分でもまとめておくと、Silverlight3β版を開発するには、
開発環境として
・Visual Studio 2008 SP1
・Microsoft Expression Blend 3 Preview(無償)
・Visual Web Developer 2008 Express Edition with Service Pack 1(無償)
の何れが必要です。


Expression Blend 3はまだ正式公開されておらずトライアル版といったところでしょうか。
以下よりダウンロードできます。
http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=a04aa0ae-87be-4201-a65e-e792859122fc


上記のほかに、Visual Studio 2008 SP1もしくはVisual Web Developer 2008 Expressを使用する場合は、
Visual Studio 2008 SP1 用 Microsoft Silverlight3 Tools
が必要です。

※注意
Silverlight3 Toolsをインストールすると基本的にSilverlight2の開発ができなくなりますが、ツールにより切り替えが出来るようです。詳しくはこちら
青柳 臣一 ブログ(総合) [Silverlight] Siverlight 3 Tools と Silverligh 2 Tools とを切り替えて使う方法


一昔前は、Silverlightについての情報は少なく開発が大変でしたが、最近は情報が増えてきましたね。
自分もなるべく情報を発信していきたいと思います。
posted by しおしおプログラマ〜 at 08:03 | Comment(0) | TrackBack(0) | Silverlight

2009年06月05日

Silverlight2 まとめ

突然ですが、Silverlightについてです。
なぜ急にSilverlightかは、とりあえず置いておいて、
開発環境等まとめておきたいと思います。

とは言え、Silverlightの現在の最新バージョンである2が公開されてから半年以上たつわけで、すでにまとめている方が多数いらっしゃいます。
 http://blogs.msdn.com/shintak/archive/2008/11/26/9143209.aspx
  MSエバンジェリストの高橋さんのブログです。
その他、
 http://koguma.cocolog-nifty.com/koguma/2008/11/silve-1.html
 http://blog.chiztek.net/?p=81
などがあります。

一応自分でもまとめておくと、Silverlight2を開発するには、
開発環境として
・Visual Studio 2008
・Expression Blend 2
・Visual Web Developer 2008 Express Edition with Service Pack 1(無償)
の何れかが必要です。

ただし、通常開発する場合、Expression Blend 2+Visual Studio 2008の両方が必要になると思います。
この2製品は一長一短(出来ることと出来ないことの差がはっきりしている)なので、開発中は両方のアプリを立ち上げ、都度切り替えて開発することになります。

上記開発環境のほかに、
Visual Studio 2008 SP1
Visual Studio 2008 SP1 用 Microsoft Silverlight Tools
Expression Blend 2 Service Pack 1
をすべてインストールする必要があります。

このほかSilverlightに関するMS公式なHPとして、
Microsoft Silverlight
The Official Microsoft Silverlight Site
PROJECT UX
CodePlex
があります。

とくにCodePlexは様々なライブラリやツールが登録されているので、一度見る価値はあると思います。
posted by しおしおプログラマ〜 at 01:15 | Comment(0) | TrackBack(0) | Silverlight