2010-05-05 18 views
1

场景: 我有一个在Silverlight(4)中开发的PRISM应用程序,并且我使用ASP.NET服务器端应用程序来托管多个Web服务,反过来,访问WCF服务,但这并不重要)。 Silverlight应用程序必须能够调用Web服务跨域(这意味着Web服务不一定位于托管Silverlight应用程序的同一台服务器上)。在Silverlight中使用ASP.NET会话状态(PRISM)

Silverlight应用程序由几个模块组成,每个模块都访问ASP.NET Web服务。

我没有太多的经验与Silverlight和PRISM,但据我所看到的,这并不是一个非常不寻常的场景......

问题: 我challange是,当两个不同的模块访问Web服务,我在Web服务器上得到2个新会话。我会认为,因为两个模块都在同一个HTML页面上(然后也在同一个浏览器会话中),他们会在Web服务器上获得相同的会话......?

我试图通过注册一个实例(使用Container.RegisterInstance)在容器中使用全局可用的Web服务代理客户端(使用Unity),然后在模块需要创建Web时获取此实例 - 服务调用(使用Container.Resolve),但这似乎没有帮助。

但是,在同一模块内进行的任何调用总是在服务器上获得相同的会话。

任何人都可以看到我在这里失踪...?

谢谢!

Jon

回答

1

看起来像我找到了我自己的答案。

问题是我的应用程序在启动时触发了多个Web服务调用(不同的PRISM模块独立工作)。而且,在网络服务器发出任何响应之前进行了几次调用,在进行后续调用之前,没有会话(因此没有提供“ASP.NET_SessionId”cookie)返回给客户端。

我的解决办法,以确保我做一个调用(异步一如既往),例如一个简单的平如Web服务,然后按住所有其他呼叫到网络服务器上,直到这个响应又回来了。然后,所有后续调用在服务器上被赋予相同的Session(因为现在它们都在头中包含“ASP.NET_SessionId”cookie)。

在实践中,这个调用是由PRISM-shell完成的,在我收到响应之前没有模块正在加载。然后我确信,在手头有一个会话状态之前,其他模块都不会触发快乐。

不过,如果有人看到这个解决方案的其他问题,我很乐意听到你的消息。

谢谢!

Jon