并行使用Javascript中的多个.NET Web服务

Consuming Multiple .NET Web Services from Javascript in Parallel

本文关键字:NET Web 服务 Javascript 并行      更新时间:2023-09-26

我有两个使用javascript的ASMX web服务。第一个服务执行一个长操作,并根据其进度更新数据库表。第二个服务轮询相同的数据库表,以便通过进度条向最终用户报告进度。

我的问题是,漫长的过程似乎阻碍了投票服务。当我记录javascript的活动时,它似乎正确地请求了长服务,然后开始每秒异步请求一次轮询服务(注意:长进程也是异步的)。这两种请求类型都使用setIntervalsetTimeout,这两种类型不应停止浏览器。然而,当我查看javascript的活动时,在漫长的过程完成之前,轮询请求的响应都不会返回。因此,这个漫长的过程似乎是在阻止轮询请求,直到它完成为止。

以下是真相:

JavaScript:

var percentComplete = 0;
setTimeout(function ()
{
    MyWebService.CreateBulkOrder(serverVariable, function (result, eventArgs)
    {
        percentComplete = 100;
        completeOperation(result);
    });
}, 0);
var intID = setInterval(function ()
{
    if (percentComplete < 100)
    {
      MyWebService.GetStatus(serverVariable, callback);
    }
    else
    {
        clearInterval(intID);
    }
}, 1000);

服务代码(VB.NET-注意:代码已更改为通用代码)

   <System.Web.Script.Services.ScriptService()>
<System.Web.Services.WebService(Namespace:="http://mydns.com/webservices")>
<System.Web.Services.WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)>
<ToolboxItem(False)>
Public Class MyWebServices
    Inherits System.Web.Services.WebService
<WebMethod(EnableSession:=True)>
Public Function GetStatus(serverVariable As Integer) As Object
    Dim currentPage As Integer = 0
    Dim totalPages As Integer = Math.Ceiling(CType(If(Session("Number of Records"), Double) / CType(ConstantsCommon.TOTAL_PER_PAGE, Double))
    Using clientDB As ClientDataContext = FunctionsOrderMgmt.ClientConnectionReadOnly
        Dim repeatPageQuery = From repeatPage In clientDB.RepeatPages
                              Where repeatPage.KEY = serverVariable
                              Select repeatPage
        Dim repeatPageData = repeatPageQuery.SingleOrDefault()
        If repeatPageData Is Nothing Then
            currentPage = 0
        Else
            currentPage = If(repeatPageData.REPEAT_PAGE, 0)
        End If
        Return New With {.TotalPages = totalPages, .CurrentPage = currentPage}
    End Using
End Function
<WebMethod(EnableSession:=True)>
Public Function CreateBulkOrder(serverVariable As Integer) As Boolean
    If Not TestsPass Then
        Return False
    End If
    Try
        'Do stuff that takes a long time
    Catch ex As Exception
        Return False
    End Try
    Return True
End Function
End Class

将"OneWay=true"添加到CreateBulkOrder Webmethod,否则它将等待响应。

http://msdn.microsoft.com/en-us/library/system.web.services.protocols.soapdocumentmethodattribute.oneway(v=vs.71).aspx