jQuery / ASP.NET并发Ajax调用

时间:2012-03-26 12:28:58

标签: asp.net jquery

我有一个网页,用户可以在其中查找客户并选择它们。选择后,可以通过jQuery Ajax调用将它们发送到Web服务器。在服务器数据库操作和另一个Web服务被调用,所以这可能需要一段时间。这就是我想向用户提供进度条的原因。

此进度条也通过Ajax调用进行更新。

问题似乎是asp.net不允许并发呼叫,会话状态将所有呼叫排队。您可以通过设置属性[SessionState(SessionStateBehavior.ReadOnly)]

在mvc中解决此问题

但我不会在我的页面覆盖webmethods中发现这一点。无论如何, worker 方法正在使用会话状态(为了安全性,并更新进度条的会话变量)。 progress 方法仅读取并返回会话变量。

是否有解决方案,或者是否需要另一种方法?

我正在使用 asp.net 4

2 个答案:

答案 0 :(得分:1)

您可以将会话模式设置为只读标记中的@Page指令:

<%@ Page Title="Home Page" EnableSessionState="ReadOnly" Language="C#" %>

答案 1 :(得分:0)

我找到了解决方案:

1)WebMethod只需要接收数据并启动一个新线程:

<WebMethod()> _
Public Shared Function importContacts(ByVal contactGuids As String, ByVal campaignGuids As String) As String
  Dim paramsList As New List(Of Object)

  paramsList.Add(contactGuids)
  paramsList.Add(campaignGuids)
  paramsList.Add(HttpContext.Current.Session)

  Dim th As New Threading.Thread(AddressOf processImport)

  th.Start(paramsList)

  Return ""
End Function

Ajax调用快速结束,您可以在浏览器上开始轮询进度。

2)线程函数需要先转换参数,然后才能使用会话状态:

Public Shared Sub processImport(params As Object)
  Dim paramsList As List(Of Object) = params
  Dim contactGuids As String = paramsList(0)
  Dim campaignGuids As String = paramsList(1)
  Dim _session As HttpSessionState = paramsList(2)

  _session("EmailMarketingDatabase_progress") = 0
  ...
End Sub

3)进度WebMethod如下所示:

<WebMethod()> _
Public Shared Function getProgressStatus() As Integer
  Return HttpContext.Current.Session("EmailMarketingDatabase_progress")
End Function