繁体   English   中英

jQuery / ASP.NET并发Ajax调用

[英]jQuery/ASP.NET concurrent Ajax calls

我有一个网页,用户可以在其中寻找客户并选择他们。 选择之后,它们可以通过jQuery Ajax调用发送到Web服务器。 在服务器上进行数据库操作并调用另一个Web服务,因此可能需要一段时间。 这就是为什么我想向用户展示进度条的原因。

这个进度条也可以通过Ajax调用来更新。

问题似乎是asp.net不允许并发调用,并且会话状态将所有调用排队。 您可以通过设置属性[SessionState(SessionStateBehavior.ReadOnly)]在mvc中解决此问题

但是在我的网页隐藏Web方法中我找不到这样做。 无论如何, worker方法正在使用会话状态(出于安全性考虑,并为进度栏更新会话变量)。 progress方法仅读取并返回会话变量。

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

我正在使用asp.net 4

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

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

我找到了解决方案:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM