【问题标题】:ASP.NET Ajax - Asynch request has separate session?ASP.NET Ajax - 异步请求有单独的会话?
【发布时间】:2010-09-12 18:33:22
【问题描述】:

我们正在编写一个搜索应用程序,它将搜索条件保存到会话状态并在 asp.net 更新面板中执行搜索。有时当我们连续执行多次搜索时,第二次或第三次搜索有时会返回第一组搜索条件的结果。

示例:我们第一次搜索“John Smith” -> 显示 John Smith 结果。我们在“Bob Jones”上进行的第二次搜索 -> 显示 John Smith 结果。

正如我所说,我们将所有搜索条件保存在会话状态中,并从 ajax 请求内部的会话状态中读取它以格式化数据库查询。当我们在 VS 中设置断点时,一切都会正常运行,但没有它们,我们会得到原始的搜索条件和结果。

我的猜测是因为它们保存在会话中,ajax 请求以某种方式获取自己的会话并将条件保存到该会话中,然后每次都从该会话中检索条件,但是非异步的东西能够看到当条件被修改并相应地保存对状态的更改时,但由于它们来自两个不同的会话,所以保存和读取的内容存在差异。

编辑::: 为了详细说明,有人建议将搜索条件附加到查询字符串中,这通常是一种很好的做法,我同意它应该是这样的,但按照我们的要求,我认为它不可行。他们想要它,以便用户填写输入控件点击搜索并且没有页面重新加载,他们唯一看到的是页面上的进度指示器,并且他们仍然能够导航和使用当前页面上的其他功能。如果我要向查询字符串添加条件,我将不得不执行另一个请求,导致整个页面加载,这取决于搜索条件可能需要很长时间。这就是为什么我们使用 ajax 调用来执行搜索以及为什么我们没有引起另一个完整页面请求的原因.....我希望这可以澄清情况。

【问题讨论】:

    标签: asp.net ajax session asp.net-ajax


    【解决方案1】:

    只是另一个想法,我总是遇到 updatepanel 的问题,我更喜欢直接通过库编写我的 atlas ajax 请求,使用 PageMethods。您可以更好地控制发送和接收的内容。 UpdatePanel 发送整个页面,并接收整个页面控件层次结构,然后解析出什么是“新鲜”并显示出来。

    编辑:您用于将条件保存到会话的代码是什么?您在方法中是否有代码可以实际检查会话是否有一些保存的标准,然后将其传回?也许这就是为什么第二/第三更新面板回发返回第一组标准而不是预期结果的原因?顺便说一句,我通过做一些繁重的 atlas ajax 事情知道绝对没有两个会话(一个用于正常回发,一个用于异步)您是否有机会使用网络农场?

    编辑#2:如果我不是一个回复的人的粉丝,我将无法写出上面写的内容(第一段):https://stackoverflow.com/users/60/dave-ward

    【讨论】:

    • 是的,我们正在保存标准并在同一个更新面板中返回结果。没有网络方法。我们保存条件是因为不应该从另一个用户控件(结果)调用条件用户控件,所有内容都将被保存并从控制器中检索。
    • Dave Ward 去年至少六次保存了我的隐藏,当时我正致力于同时使用 asp.net ajax 和 jQuery 的项目。
    【解决方案2】:

    在正常的 ASP.NET 页面加载、回发和 ASP.NET AJAX 部分回发之间没有多个会话。我可以肯定地告诉你。

    与其将搜索字符串存储在会话中,不如直接使用搜索文本框的内容?我想不出你需要随机播放它的任何理由,因为无论如何它在整个页面生命周期中都可用。

    最后,关于您的要求...使用 UpdatePanel 确实满足您的用户应该能够使用页面上的其他功能(如果该功能也引发部分回发)的要求。一次只能进行一个部分回发。如果在您的搜索过程中引发了另一个事件,搜索请求将被取消,而不会发出任何通知。

    使用页面方法或网络服务进行搜索将是一种更快、更简单、更可靠的方法。我通常不插入自己的网站,但我认为我的一些帖子与您正在做的事情完全相关:

    您可以使用用户控件通过 Web 服务呈现搜索结果(比 UpdatePanel 快得多):http://encosia.com/2008/02/05/boost-aspnet-performance-with-deferred-content-loading/

    或者,您可以将搜索结果作为 JSON 返回并在客户端呈现(甚至更快):http://encosia.com/2008/06/26/use-jquery-and-aspnet-ajax-to-build-a-client-side-repeater/

    这两种方法中的任何一种都可以使您的搜索功能脱离部分回发范式,从而使其运行速度更快、使用更少的带宽和服务器资源,并且不会阻止其他 UpdatePanel 活动同时发生。

    【讨论】:

      【解决方案3】:

      您需要为正在调用的函数设置 WebMethod 属性的 EnableSession 属性。

      [WebMethod( EnableSession=true )]
      public static void DoSomething(){
          /// ....
      }
      

      【讨论】:

        【解决方案4】:

        如果您使用通用处理程序 .ashx,只需从 IRequiresSessionState 接口派生

        public class ActionRequest : IHttpHandler, IRequiresSessionState
        {
        }
        

        【讨论】:

          猜你喜欢
          • 2015-12-25
          • 1970-01-01
          • 1970-01-01
          • 2014-02-02
          • 2021-12-01
          • 1970-01-01
          • 2023-04-01
          • 2021-12-06
          • 2016-05-05
          相关资源
          最近更新 更多