我有一个启用了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天的时间来研究这个问题并且似乎无法找到解决方案。有没有人对此有任何见解?
答案 0 :(得分:1)
好的,我弄清楚发生了什么,并认为我会在这里发布,以防其他人遇到这种问题。使用fiddler是让我走上正轨的工具。
基本上,我用来调用javascript函数的链接按钮是调用整页回发,而不只是调用javascript函数。因此,如果请求足够小,则对Web服务调用的响应很快就会响起,并且网页会使用收到的新JSON数据运行回调函数。随着数据集变大,有时响应会及时返回,以便页面处理结果。但是,有时在完整页面回发完成并且对回调函数的引用丢失之后,响应将不会返回。所以它会取回JSON数据,但不知道如何处理它。
所以我通过链接按钮调用的javascript函数总是返回false来取消回发帖,问题解决了。
我只有另外一个问题需要处理,那就是将服务的MaxObjectsInGraph设置设置为足够高的值来说明返回的JSON大小。我唯一觉得奇怪的是,如果这个设置不够高,我会得到一个挑战响应框,询问前几次尝试的登录名,然后该服务将返回一个未知的状态代码。 / p>
无论如何,我希望这篇文章证明对其他人有帮助。
答案 1 :(得分:0)
除非我们有
的JavaScript定义,否则我认为我们无法帮助您解决问题NoteService.GetAllInsuredNotes(insuredId, CallBack1, CallBack2, WhatIsThisParam)