原型AJAX Post参数随机丢失



好吧,我有一个.NET应用程序,它使用Prototype库对后面页面中的Web方法进行AJAX调用以检索数据。这个应用程序已经运行了很长一段时间,没有任何问题。最近,一位新用户开始使用该应用程序,并遇到了一些奇怪的问题。

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

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方法中第一个被称为"丢失"的参数。这让我相信post数据不会以某种方式返回?(相关?:JQueryAjax发布参数有时不会在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是如下对象:

{'Flet':'FletVal','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

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

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

function gAjax(url, params, onSuccess, onError, onException, onComplete) {
params['debug']=Object.toJSON(params);
new Ajax.Request(url,
//....

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

希望这能有所帮助!

最新更新