场景: 我有一个在Silverlight(4)中开发的PRISM应用程序,我使用ASP.NET服务器端应用程序来托管多个Web服务(反过来,它访问WCF服务,但这在这里并不重要)。 Silverlight应用程序必须能够跨域调用Web服务(这意味着Web服务不一定在托管Silverlight应用程序的同一服务器上)。
Silverlight应用程序由几个模块组成,每个模块都访问ASP.NET Web服务。
我对Silverlight和PRISM没有多少经验,但据我所知,这不是一个非常不寻常的场景......
问题: 我的挑战是,当两个不同的模块访问Web服务时,我在Web服务器上获得了2个新会话。我原以为既然两个模块都存在于同一个HTML页面上(然后也是在同一个浏览器会话中),那么它们会在Web服务器上获得相同的会话......?
我试图通过注册一个实例(使用Container.RegisterInstance),在容器中全局提供Web服务代理客户端(使用Unity),然后在模块需要创建Web时获取此实例服务调用(使用Container.Resolve),但这似乎没有帮助。
但是,在同一模块中进行的任何调用始终在服务器上获得相同的会话。
谁能看到我在这里失踪的东西......?
谢谢!
乔恩
答案 0 :(得分:1)
看起来我找到了自己的答案。
问题是我的应用程序在启动时触发了多个Web服务调用(不同的PRISM模块独立工作)。并且在从Web服务器发出任何响应之前进行了多次调用时,在进行后续调用之前,没有会话(因此没有提供“ASP.NET_SessionId”cookie)回到客户端。
我的解决方案是确保我进行一次调用(一如既往的异步),例如一个类似Ping的Web服务,然后保持对Web服务器的所有其他调用,直到这个回应了。然后,所有后续调用在服务器上都被赋予相同的Session(因为现在它们都在头文件中包含“ASP.NET_SessionId”cookie)。
在实践中,这个调用是由PRISM-shell进行的,在收到响应之前没有任何模块被加载。然后我绝对相信在我手头有会话状态之前,没有其他模块能够获得触发器。
但是,如果有人发现此解决方案有任何其他问题,我很高兴收到你的来信。
谢谢!
乔恩