Параллельное использование нескольких веб-сервисов .NET из Javascript - PullRequest
1 голос
/ 29 июня 2011

У меня есть две веб-службы 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

1 Ответ

0 голосов
/ 29 июня 2011

Добавьте 'OneWay = true' в веб-метод CreateBulkOrder, иначе он будет ожидать ответа.

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

...