ASP.NET Ajax-异步请求是否具有单独的会话?

时间:2020-03-06 14:40:11  来源:igfitidea点击:

我们正在编写一个搜索应用程序,该应用程序将搜索条件保存到会话状态,并在asp.net updatepanel内部执行搜索。有时,当我们连续执行多个搜索时,第二或者第三搜索有时会返回来自第一组搜索条件的结果。

示例:我们的第一次搜索是查找" John Smith"->显示John Smith结果。第二次搜索我们在" Bob Jones"上查找->显示John Smith结果。

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

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

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

解决方案

我们需要为要调用的函数设置WebMethod属性的EnableSession属性。

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

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

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

编辑#2:如果我不喜欢也回答的人,我将无法写上面的内容(第一段):https://stackoverflow.com/users/60/戴维沃德

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

与其直接在会话中存储搜索字符串,不如直接使用搜索文本框的内容怎么办?我想不出为什么需要改组它的任何原因,因为无论如何它会在整个页面生命周期中可用。

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

使用页面方法或者Web服务进行搜索将是一种更快,更轻松且更可靠的搜索方式。我通常不插入自己的网站,但我认为我的几篇文章与我们正在做的事情完全相关:

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

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

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

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

public class ActionRequest : IHttpHandler, IRequiresSessionState
{
}