WCF с поддержкой Ajax только периодически возвращается к функции обратного вызова - PullRequest
3 голосов
/ 08 июня 2010

У меня есть служба WCF с поддержкой ajax, которая возвращает набор объектов JSON обратно в браузер. У сервиса есть простая функция, которая вызывает dll бизнес-уровня. Затем он возвращает объекты вызывающему методу.

Ниже приведена реализация службы (за исключением операторов Imports):

<ServiceContract(Namespace:="")> _
<AspNetCompatibilityRequirements(RequirementsMode:=AspNetCompatibilityRequirementsMode.Allowed)> _
<ServiceBehavior(IncludeExceptionDetailInFaults:=True, MaxItemsInObjectGraph:=5000)> _
Public Class NoteService

<OperationContract()> _
Public Function GetAllInsuredNotes(ByVal insuredID As Integer) As List(Of NoteExport)
    Dim allNotes As New List(Of NoteExport)

    Using nr As New NoteRepository()
        allNotes = nr.GetInsuredNotesForExport(insuredID)
        If allNotes Is Nothing Then
            Throw New InvalidOperationException("The operation to retrieve notes caused an error.")
        End If
    End Using

    Return allNotes.ToList()
End Function

Javascript для вызова моего сервиса выглядит следующим образом:

    function exportToExcel(sender, eventArgs) {
        var insuredID = $('input[id*=hdnInsuredID]').val();
        NoteService.GetAllInsuredNotes(insuredID, OnNoteGetSuccess, OnNoteGetFailure, null);
    }

    function OnNoteGetSuccess(result) {
        var insuredID = $('input[id*=hdnInsuredID]').val();
        OutputExcel(insuredID, result);
        return true;
    }

    function OnNoteGetFailure(result) {
        alert('There was an error retrieving notes for export.  Please contact the help desk for assistance.');
        return false;
    }

В основном моя проблема заключается в следующем. С точки зрения функций на стороне сервера все работает нормально. Каждый раз, когда я вызываю функцию на стороне клиента, выполняется код на стороне сервера и генерируется результат. Однако функция обратного вызова успеха вызывается только периодически. Я могу вызвать функцию несколько раз и сделать обратный вызов только один раз. Проблема, похоже, усугубляется с увеличением возвращаемого набора результатов.

Я мог бы понять, связано ли это с настройкой MaxObjectsInGraph, но проблема не в том, что результат никогда не вернется, если у меня будет большой объем данных. Это будет возвращаться иногда каждую четвертую или пятую попытку, иногда 2 попытки подряд, иногда 1 из 10 попыток. Это кажется очень случайным.

Я потратил как минимум 2 дня, ломая голову над этим, и, похоже, не могу найти решение. У кого-нибудь есть понимание этого?

Ответы [ 2 ]

1 голос
/ 08 июня 2010

Хорошо, я разобрался, что происходит, и подумал, что опубликую это здесь на случай, если кто-то еще столкнется с такой проблемой.Использование fiddler было инструментом, который поставил меня на правильный путь.

По сути, кнопка ссылки, которую я использовал для вызова функции javascript, вызывала обратную передачу всей страницы, а не просто вызывала функцию javascript.Поэтому, если запрос был достаточно мал, ответ на вызов веб-службы пришел быстро, и веб-страница запустила функцию обратного вызова с новыми полученными данными JSON.По мере того, как наборы данных увеличивались, иногда ответ возвращался вовремя, чтобы страница обрабатывала результаты.Однако иногда ответ не возвращался до тех пор, пока не была завершена обратная передача всей страницы, и ссылка на функцию обратного вызова была потеряна.Таким образом, он вернул бы данные JSON, но не знал бы, что с ними делать.

Поэтому у меня была функция javascript, вызываемая кнопкой ссылки, всегда возвращавшая false, чтобы отменить пост обратно, и проблема была решена.

У меня была только одна другая проблема, которая заключалась в том, чтобы установить для параметра MaxObjectsInGraph для службы достаточно высокое значение, чтобы учесть возвращаемый размер JSON.Единственное, что я все еще нахожу странным, это то, что если этот параметр не был достаточно высоким, я бы получил окно ответа на запрос с запросом имени для входа в систему для первых нескольких попыток, а затем служба просто вернулась бы с неизвестным кодом состояния.

В любом случае, я надеюсь, что этот пост окажется полезным для кого-то еще.

0 голосов
/ 08 июня 2010

Я не думаю, что мы можем помочь вам понять это, если у нас нет определения JavaScript для

NoteService.GetAllInsuredNotes(insuredId, CallBack1, CallBack2, WhatIsThisParam)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...