Silverlight(Prism)でASP.NETセッション状態を使用する
-
03-10-2019 - |
質問
シナリオ:Silverlight(4)で開発されたプリズムアプリケーションがあり、ASP.NETサーバーサイドアプリケーションを使用していくつかのWebサービスをホストします(WCF-Servicesにアクセスしますが、ここではそれほど重要ではありません。 )。 Silverlightアプリケーションは、Webサービスのクロスドメインを呼び出すことができる必要があります(つまり、Webサービスは必ずしもSilverlightアプリケーションをホストする同じサーバー上にあるわけではありません)。
Silverlightアプリケーションはいくつかのモジュールで構成され、それぞれがASP.NET Webサービスにアクセスします。
私はシルバーライトとプリズムの経験はあまりありませんが、私が見る限り、これは非常に珍しいシナリオではありません...
問題:私の挑戦は、2つの異なるモジュールがWebサービスにアクセスすると、Webサーバーで2つの新しいセッションを取得することです。両方のモジュールが同じHTML-PAGEで(そして同じブラウザセッションでも)ライブしているので、Web-Serverで同じセッションを取得するだろうと思っていたでしょうか...?
コンテナで(Unityを使用)、インスタンスを登録する(Container.registerInstanceを使用)、その後、モジュールがWeb-Service通話を行う必要があるときにこのインスタンスを取得することにより、コンテナでグローバルに利用できるようにしようとしました(unityを使用して) container.resolve)を使用しますが、これは役に立たないようです。
ただし、同じモジュール内で行われた呼び出しは、常にサーバー上で同じセッションを取得します。
誰もが私がここで見逃しているものを見ることができますか...?
ありがとう!
ジョン
解決
自分の答えを見つけたようです。
問題は、私のアプリケーションがスタートアップ(異なるプリズムモジュールが独立して動作する)に複数のWebサービスコールを起動していたことでした。また、Webサーバーから応答が行われる前にいくつかの呼び出しが行われたとき、セッションはありません(したがって、「ASP.NET_SESSIONID」Cookieが提供されませんでした)。
私の解決策は、私が作ることを確認することでした 1 たとえば、単純なpingのようなWebサービスなど、(いつものようにAsync)に電話してから、この応答が戻るまで他のすべての呼び出しをWebサーバーに保持します。次に、後続のすべての呼び出しがサーバー上で同じセッションが与えられます(現在、すべてがヘッダーに「ASP.NET_SESSIONID」Cookieが含まれているためです)。
Praticeでは、この呼び出しはプリズムシェルによって行われ、reponseを受け取る前にモジュールがロードされていません。それから、セッションステートを手元に置く前に、他のモジュールがトリガーハッピーを取得しないことは絶対に確信しています。
それでも、もし誰かがこの解決策で他の問題を見ているなら、私はあなたから聞いてうれしいです。
ありがとう!
ジョン