ASP.NET Ajax - Asynch请求有单独的会话吗?

Mar*_*ing 5 asp.net ajax session asp.net-ajax

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

示例:我们的第一次搜索我们查看"John Smith" - >显示John Smith结果.第二次搜索我们查看"Bob Jones" - >显示John Smith结果.

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

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

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

Evi*_*Syn 5

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

编辑:您用于将条件保存到会话的代码是什么?你是否在方法中有代码实际检查会话是否有一些保存的条件,然后将其传回去?也许这就是为什么第二/第三更新面板回发会返回第一组标准而不是预期结果?顺便说一句,我知道从做一些沉重的地图集ajax的事情,肯定没有两个会话(一个用于正常回发,一个用于异步)你有没有机会使用webfarm?

编辑#2:如果我不是那些回复的人的粉丝,我就无法写出我上面写的内容(第一段):https://stackoverflow.com/users/60/戴夫病房


Dav*_*ard 4

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

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

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

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

您可以使用用户控件通过 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- a-客户端中继器/

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