У меня есть две веб-службы ASMX, используемые в javascript.Первый сервис выполняет длительную операцию и обновляет таблицу базы данных о своем прогрессе.Вторая служба опрашивает ту же таблицу базы данных, чтобы сообщить о ходе выполнения конечному пользователю через индикатор выполнения.
Моя проблема заключается в том, что длительный процесс, по-видимому, блокирует службу опроса.Когда я регистрирую активность javascript, он, кажется, правильно запрашивает длинную службу, а затем начинает запрашивать службу опроса асинхронно один раз в секунду (примечание: длинный процесс также асинхронен).Оба типа запросов используют setInterval
или setTimeout
, что не должно останавливать работу браузера.Тем не менее, когда я смотрю на активность 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