Javascript 原型AJAX Post参数随机丢失

Javascript 原型AJAX Post参数随机丢失,javascript,asp.net,ajax,prototype,Javascript,Asp.net,Ajax,Prototype,好的,我有一个.NET应用程序,它使用原型库对后面页面中的webmethods进行AJAX调用以检索数据。这个应用程序已经启动并运行了一段时间,没有出现任何问题。最近,一个新用户开始使用该应用程序,并遇到一些奇怪的问题 基本上,他可以在一段时间内很好地使用应用程序,然后它就开始在AJAX调用中抛出错误,声明webmethod缺少参数。以下是错误: System.InvalidOperationException - Unable to perform the requested action:

好的,我有一个.NET应用程序,它使用原型库对后面页面中的webmethods进行AJAX调用以检索数据。这个应用程序已经启动并运行了一段时间,没有出现任何问题。最近,一个新用户开始使用该应用程序,并遇到一些奇怪的问题

基本上,他可以在一段时间内很好地使用应用程序,然后它就开始在AJAX调用中抛出错误,声明webmethod缺少参数。以下是错误:

System.InvalidOperationException - Unable to perform the requested action:  Invalid web service call, missing value for parameter: 'fleet'.
   at System.Web.Script.Services.WebServiceMethodData.CallMethod(Object target, IDictionary'2 parameters)
   at System.Web.Script.Services.WebServiceMethodData.CallMethodFromRawParams(Object target, IDictionary'2 parameters)
   AT SYSTEM.WEB.SCRIPT.SERVICES.RESTHANDLER.INVOKEMETHOD(HTTPCONTEXT CONTEXT, WEBSERVICEMETHODDATA METHODDATA, IDICTIONARY`2 RAWPARAMS)
   at System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)
不只是一个调用会出错,任何ajax调用都是随机的,而且它似乎总是webmethod中第一个被称为“missing”的参数。这让我相信post数据不会以某种方式返回?(相关?:)

我从来没有能够重现这个问题,也没有任何其他用户经历过它。这让我相信是这个用户系统的某些特定因素导致了这个问题。不幸的是,他们是一个相当重要的用户,所以我需要尝试解决这个问题。用户将IE8作为其浏览器。下面是使用prototype进行ajax调用的代码:

function gAjax(url, params, onSuccess, onError, onException, onComplete) {

    new Ajax.Request(url,
    {
         method:'post',                                     //Post
         contentType:"application/json; charset=utf-8",     //As JSON
         postBody:Object.toJSON(params),                    //Post Body is JSON string
         sanitizeJSON:true,                                 //Sanitize the JSON
         onComplete:onComplete,                             //Set user on complete
         onSuccess:onSuccess,                               //Set user on success
         onFailure:onError,                                 //Set user on error
         onException:onException                            //Set user on exception
    });
}
onComplete、onSuccess、onError、onException是函数回调。params是如下所示的对象:

{'fleet':'fleetVal','bin':1234}

Url是方法,例如Bin.aspx/LoadBinInfo。此方法在后端定义如下:

    <System.Web.Services.WebMethod()> _
    Public Shared Function LoadBinInfo(ByVal fleet As String, ByVal bin As Integer) As Dictionary(Of String, Object)

        '.....
        'Returns a dictionary of info
    End Function
_
公共共享函数LoadBinInfo(ByVal fleet作为字符串,ByVal bin作为整数)作为字典(字符串的,对象的)
'.....
'返回信息字典
端函数

如果任何人对正在发生的事情有任何想法,我将非常感谢任何意见!在我的研究中,我似乎找不到任何信息来引导我找到可能的原因。同样,这似乎只发生在这一个用户身上,所以可能是他的浏览器设置(有什么想法吗?)。但是,这对他来说也是零星的,但一旦开始发生,它就会不断发生,直到他关闭浏览器重新开始。

我在这里回答,因为我似乎没有足够的声誉来评论而不是回答。 现在还不清楚请求中缺少了什么,但我会继续检查web日志(或设置某种日志),以查看系统实际接收到了什么。根据您对问题的描述,请求不知何故缺少“fleet”参数。但您并不是在请求中单独发送这样的值,而是将post正文中的所有数据作为序列化JSON字符串发送。 因此,要么传递给gAjax的数据不正确/不完整,要么服务器上发生了奇怪的事情。 我显然怀疑是前者,但无论如何,您应该尝试在两端进行日志记录和调试。 首先,我会这样做:

function gAjax(url, params, onSuccess, onError, onException, onComplete) {

    params['debug']=Object.toJSON(params);
    new Ajax.Request(url,
//....
这将向请求中添加JSON字符串,以便您可以准确地检查发送的内容


希望这有帮助

听起来可能是内存泄漏。让用户打开任务管理器并监控随时间变化的可用RAM。此应用程序位于我们的服务器上,供许多站点的用户使用。只有一个站点的一个用户才会遇到此问题。其他网站运行时都没有问题。应用程序内存泄漏会导致所有用户出现问题,对吗?或者你是说他们处理JS的客户端机器上存在IE内存泄漏?我找到了另一条线索,可能有助于缩小这个范围。出现此问题的用户有时也会在返回时遇到问题。有时,当AJAX调用返回responseJSON时,返回值为null。这可能是相互关联的吗?我还发现,同一站点的另一个用户偶尔会遇到空响应问题;尽管他从未收到丢失的参数错误。所有证据似乎都指向了该网站特有的一些问题(浏览器设置等)。还要注意的是,他们的IT控制着他们的系统设置。你有没有偶然运行的压缩处理程序?没有,我不知道。原来的问题似乎已经停止了。。。。我让遇到问题的用户将站点添加为可信站点,并稍微更改了原型ajax参数,但是这两个用户仍然遇到NULL responseJSON错误。我添加了额外的日志以查看他们实际得到的响应,而响应似乎是空白的。我似乎不明白为什么会发生这种情况。它只在对webmethods的不同调用上随机发生,并且不特定于任何集合。我将在下一篇评论中发布传输。因此,参数没有到达后端的问题已经得到纠正,我认为这是他们浏览器的问题。这两个用户所在的工厂受到高度监管。我认为问题在于他们的处境,因为他们是唯一发生这种情况的两个人。唯一剩下的问题是,回应永远不会回来。假设他们调用来更新条目,调用被调用,条目被更新,结果被返回。所有这些都有效,除了用户永远不会得到结果!我添加了日志来写他们收到的(下一步)这是他们收到的响应(注释1/2):{'request':{'options':{'method':'post','asynchronous':true,'contentType':'application/json','encoding':'UTF-8','parameters':'','evalJS':true,'postBody':'{'crumpid':2}','global':true},'transport':{'status':200,'timeout':0,'responseXML':,'readyState':4,'responseText':'','statusText':'Unknown'},'url':'/Critical\u Spares/Default.aspx/GetCrumbLink','method':'post','parameters':{},'body':'{'crumpid':2},'statuscomplete','true},'transport':{'status':200,'timeout','0,'responseXML','readyState':4,'responseText':'Unknown'','readyState':4,'status':200,'statusText':'Unknown','responseText':'','responseXML':}因此您可以看到,成功的状态为200,但响应对象都是e