【问题标题】:jQuery, WCF and ASP.NETjQuery、WCF 和 ASP.NET
【发布时间】:2010-11-06 07:36:05
【问题描述】:

抱歉,如果这是一个愚蠢的问题。在以前的 ASP.NET 项目中,我一直在使用 jQuery 与 ASMX Web 服务进行通信,没有任何问题 - 包括能够启用与用户会话状态的交互。

我现在正在涉足 Visual Studio 2010 和 .NET 4.0 的世界,并且我正在尝试使用启用 AJAX 的 WCF 服务来做同样的事情。

我已经掌握了一些基础知识,我让 jQuery 将数据传递到服务调用中,它会进行一些处理并返回一个 jQuery 显示给用户的值。

我的问题是 - 如何让 WCF 服务访问用户的会话信息?我有一种感觉,在我对 WCF 的理解中,我遗漏了一些相当基本的东西。任何指针将不胜感激!

【问题讨论】:

    标签: asp.net ajax wcf session


    【解决方案1】:

    [更新]:这也是一篇好文章:http://blogs.msdn.com/drnick/archive/2008/10/08/working-with-session-state.aspx

    在迁移到 WCF 时,有时会使 ASP.NET 开发人员感到困惑的一个概念是会话状态的概念。在普通的 WCF 服务中,所有的会话状态都存储在本地易失性内存中。应用程序必须选择将会话状态的一部分复制到持久存储位置,以便在运行的实例中保留该状态。 WCF 没有提供用于启用会话状态的持久存储或启用从其他进程访问会话状态的内置选项。

    有几种方法可以使 WCF 更像 ASP.NET。

    使 WCF 更像 ASP.NET 的一种方法是通过打开 ASP.NET 兼容模式使 WCF 与 ASP.NET 完全一样。承载在 IIS 中并使用 HTTP 作为传输绑定的 WCF 应用程序与 ASP.NET 管道一起运行,但无法访问许多 ASP.NET 功能。打开兼容模式可将 WCF 应用程序与 ASP.NET 管道集成,并使其中许多功能可用。显然,只有当您的 WCF 服务已经非常像 ASP.NET 应用程序时,这种方法才有意义。

    使 WCF 更像 ASP.NET 的另一种方法是将 WCF 会话状态的管理更改为使用远程持久存储而不是本地易失性内存。这种方法更像是工作流服务用来创建持久应用程序的方法。服务实例和实例上下文的管理由创建和销毁服务对象的 IInstanceProvider、创建和销毁实例上下文的 IInstanceContextProvider 以及设置新获取的实例上下文的 IInstanceContextInitializer 控制。尽管持久服务与会话状态具有不同的语义,但两者都有共同的构建块。 [/update]

    除了上述之外,我还可以向您推荐几件事。看看其中一个帖子:https://stackoverflow.com/questions/275926/wcf-data-presistence-between-sessions。接下来,考虑使用某种形式的缓存。这可以是缓存样式服务,也可以是缓存场。有关缓存的更多信息,请查看我的帖子:System.Web.Caching vs. Enterprise Library Caching Block

    这基本上允许您为用户存储一个唯一键(类似于会话 ID),并且该用户的所有所谓会话对象都将以缓存层中的用户伪会话 ID 为前缀。然后,您用来运行网站以及各种 WCF 服务/项目的网站可以调用此缓存层。

    【讨论】:

    • 感谢您的回答!!听上去——出于我的目的——我坚持使用 ASMX Web 服务不是更好吗?该服务仅用于通过 AJAX 支持 Web 应用程序的 UI,因此需要对用户的 ASP.NET 会话进行严格且定期的访问。在我的情况下使用 WCF 有什么好处?再次感谢!
    • @Chris Roberts - 如果目的仅仅是支持 UI 并且永远不会成为公共 API,那么可以 - 你可以坚持使用 ASMX。我可以想到几个使用 WCF 的原因。它具有更高的性能,并提供了许多与之通信的方式,以防服务的客户端随时间发生变化。使用 WCF 的另一个很好的理由是按照您已有的方式去做 - 了解 WCF 的工作原理(并且在您的情况下不起作用!)。
    【解决方案2】:

    好的 - 所以当我发布我最初的问题时可能为时已晚!用户的 ASP.NET 会话状态似乎可以从通常位置的服务代码获得 - 即 - HttpContext.Current.Session

    【讨论】:

    • 在你的 WCF 组件中可用吗??
    • 好像aspNetCompatibilityEnabled="true"是默认设置的。
    • @Niels:如果您有启用 Ajax 的 WCF 服务,那是正确的,然后您添加 System.Wet 以访问 HttpContext.Current.Session
    猜你喜欢
    • 1970-01-01
    • 2010-10-13
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多