【问题标题】:Silverlight, WCF AspNetCompatibilityRequirements and ASPNET Session State not sharedSilverlight、WCF AspNetCompatibilityRequirements 和 ASPNET 会话状态未共享
【发布时间】:2010-12-04 05:49:10
【问题描述】:

我有一个 Silverlight 应用程序,它通过一个按钮在新的浏览器窗口中打开一个 aspx 页面。

我想将一些用户名/密码详细信息从 Silverlight 传递到 aspx 页面。我的理解是我应该使用 WCF 服务来设置会话状态,然后可以从 aspx 页面中检索。

我遵循了我认为正确的步骤,但 aspx 页面拒绝查看 Silverlight 设置的状态。

我所做的是;

  • 创建了一个设置 System.Web.HttpContext.Current.Session["Thing"] 的 WCF 服务
  • 在该服务上,设置 AspNetCompatibilityRequirements = 必需,并在 web.config 上设置 aspNetCompatibilityEnabled="true"

我的 Silverlight 应用程序能够使用此 WCF 服务成功设置(和检索)会话信息。

但是,当我在 aspx 页面上获得 Session["Thing"] 时,它是空白的。此外,如果我在 aspx 页面上设置 Session["Thing"],Silverlight 不会得到它。

就好像两者有不同的会话——这是为什么呢?

提前致谢 马特

【问题讨论】:

    标签: wcf silverlight session


    【解决方案1】:

    您的 Silverlight 客户端与之通信的 WCF 服务是否可能位于不同的 Web 应用程序中(即,是否存在多个 Web 项目)?默认的进程内状态提供程序实际上是每个应用程序域,因此如果它们位于不同的应用程序中,您将在两个应用程序域中拥有两个会话状态副本。如果是这种情况,只需将服务代码与页面移动到同一个 webapp 中,生活就很好了。我想不出任何其他解释——我已经做了很多次了,没有任何问题。

    【讨论】:

    • 是的!这正是它的本来面目。我在另一个项目中有我的服务并添加了这个会话管理服务。我将会话管理服务移到了 aspnet 应用程序中,现在它可以正常工作了 - 谢谢!
    【解决方案2】:

    据我所知,如果您在新的浏览器窗口中打开该页面,它将创建一个新会话。共享会话的唯一希望是在 Web 服务器级别创建共享对象(丑陋)。

    为什么不直接将状态作为查询字符串传递呢?或者在带有 SL 的 HtmlHost link text 元素中打开页面?

    【讨论】:

    • 传递的信息是 aspx 页面正在运行的报告的身份验证详细信息,因此我不想使用查询字符串或 cookie 来保存该信息。我从 ComponentOne 中查看了 HtmlHost - 但这不会给我同样的问题,即将信息传递到 HtmlHost 中的 aspx 页面?
    • 你看过传递过来的SessionId了吗?您可以传递它以获取存储的数据。服务和aspx页面调用中的值真的不同吗?我在会话中遇到的唯一问题是我必须删除并重置 IIS 7 上的身份验证模块才能获取 HTTP 处理程序的用户凭据。
    • Session ID 相同。我想我可以将数据保存在服务器上的 SQL 中,但我希望保持简单。
    • 现在我记得我的 HTTP 处理程序也遇到过这个问题。我将文件保存在 Session 对象中,它在我的 IE8 上运行良好,但 FF 或 IE7 的会话总是空的 :( 我采用了将会话保存到磁盘的丑陋技巧(我需要保存文件)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-17
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    相关资源
    最近更新 更多