启用Ajax的WCF仅间歇性地返回回调函数

时间:2010-06-07 20:04:22

标签: ajax wcf callback

我有一个启用了ajax的WCF服务,它将一组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天的时间来研究这个问题并且似乎无法找到解决方案。有没有人对此有任何见解?

2 个答案:

答案 0 :(得分:1)

好的,我弄清楚发生了什么,并认为我会在这里发布,以防其他人遇到这种问题。使用fiddler是让我走上正轨的工具。

基本上,我用来调用javascript函数的链接按钮是调用整页回发,而不只是调用javascript函数。因此,如果请求足够小,则对Web服务调用的响应很快就会响起,并且网页会使用收到的新JSON数据运行回调函数。随着数据集变大,有时响应会及时返回,以便页面处理结果。但是,有时在完整页面回发完成并且对回调函数的引用丢失之后,响应将不会返回。所以它会取回JSON数据,但不知道如何处理它。

所以我通过链接按钮调用的javascript函数总是返回false来取消回发帖,问题解决了。

我只有另外一个问题需要处理,那就是将服务的MaxObjectsInGraph设置设置为足够高的值来说明返回的JSON大小。我唯一觉得奇怪的是,如果这个设置不够高,我会得到一个挑战响应框,询问前几次尝试的登录名,然后该服务将返回一个未知的状态代码。 / p>

无论如何,我希望这篇文章证明对其他人有帮助。

答案 1 :(得分:0)

除非我们有

的JavaScript定义,否则我认为我们无法帮助您解决问题
NoteService.GetAllInsuredNotes(insuredId, CallBack1, CallBack2, WhatIsThisParam)