【问题标题】:Prototype AJAX Post Parameters missing randomly原型 AJAX Post 参数随机丢失
【发布时间】:2012-09-11 01:17:50
【问题描述】:

好的,所以我有一个 .NET 应用程序,它使用 Prototype 库对页面隐藏中的 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 调用都是随机的,而且它似乎总是 web 方法中称为“丢失”的第一个参数。让我相信帖子数据不会以某种方式恢复? (相关?:JQuery Ajax post parameters sometimes not sent on IE)。

我一直无法重现此问题,也没有任何其他用户遇到过。这使我相信这是导致问题的用户系统上的特定内容。不幸的是,他们是一个相当重要的用户,所以我需要尝试解决这个问题。用户有 IE8 作为他们的浏览器。下面是使用原型进行 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

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

【问题讨论】:

  • 听起来可能是内存泄漏。让用户打开任务管理器并随着时间的推移监控可用的免费 RAM。
  • 此应用程序位于我们的服务器上,供许多站点的用户使用。只有一个站点的一位用户会遇到此问题。其他站点都运行没有问题。应用程序中的内存泄漏会给所有用户带来问题,对吗?还是说他们处理 JS 的客户端机器上存在 IE 内存泄漏?
  • 我找到了另一个可能有助于缩小范围的线索。遇到此问题的用户有时也会在退货时遇到问题。有时当 AJAX 调用返回时,responseJSON 的返回值为 null。这可能是相互关联的吗?而且我发现同一站点的另一个用户偶尔会遇到 NULL responseJSON 问题;尽管他从未收到缺少参数的错误。所有证据似乎都指向该站点特有的一些问题(浏览器设置等)。另请注意,他们的 IT 控制着他们的系统设置。
  • 你有没有偶然运行压缩的处理程序?
  • 不,我不知道。最初的问题似乎已经停止发生......我让遇到问题的用户将该站点添加为受信任并稍微更改了原型 ajax 参数,但是这两个用户仍然遇到 NULL responseJSON 错误。我添加了额外的日志来查看他们实际得到的响应,而响应似乎是空白的。我似乎无法弄清楚为什么会发生这种情况。它在对 webmethods 的不同调用中随机发生,并且不特定于任何集合。我将在下一条评论中发布运输。

标签: javascript asp.net ajax prototype


【解决方案1】:

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

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

    params['debug']=Object.toJSON(params);
    new Ajax.Request(url,
//....

这会将 JSON 字符串添加到请求中,以便您可以准确检查正在发送的内容。

希望这会有所帮助!

【讨论】:

  • 所以参数没有进入后端的问题已经得到纠正,我认为这是他们浏览器的问题。这两个用户工作的设施受到严格监管。我认为问题在于他们的一些设置,因为他们是唯一发生这种情况的 2 个。唯一剩下的问题是响应永远不会回来。因此,假设他们调用更新条目,调用被更新条目,并返回结果。除了用户永远不会得到结果之外,所有这些都有效!我添加了日志记录来写他们收到的内容(下一个)
  • 这是他们收到的响应(评论 1 of 2):{'request':{'options':{'method':'post','asynchronous':true,'contentType': 'application/json','encoding':'UTF-8','parameters':'','evalJSON':'force','evalJS':true,'postBody':'{"crumbId":2}' ,'global':true},'transport':{'status':200,'timeout':0,'responseXML':,'readyState':4,'responseText':'','statusText':'Unknown' },'url':'/Critical_Spares/Default.aspx/GetCrumbLink','method':'post','parameters':{},'body':'{"crumbId":2}','_complete': true},'运输':
  • {'status':200,'timeout':0,'responseXML':,'readyState':4,'responseText':'','statusText':'Unknown'},'readyState ':4,'status':200,'statusText':'Unknown','responseText':'','responseXML':} 所以你可以看到状态是 200 成功但是响应对象都是空的响应文本未知!调用成功了,结果从服务器返回,但用户没有收到:/.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-08
  • 1970-01-01
  • 2021-05-22
  • 1970-01-01
  • 2016-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多