好吧,所以我有一个.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,它似乎总是在webmethod中被称为“缺失”的第一个参数。让我相信帖子数据不会以某种方式回来? (相关?: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是一个如下对象:
{ '船队': 'fleetVal', '斌':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
如果有人对发生的事情有任何想法,我会非常感谢任何输入!我似乎无法在我的研究中找到任何信息来引导我找到可能的原因。再一次似乎只发生在这一个用户身上,所以也许它的浏览器设置在他的最后(任何想法是什么设置?)。但是它甚至再次对他来说是零星的,但是一旦它开始发生,它就会不断发生,直到他关闭浏览器并重新开始。
答案 0 :(得分:0)
我在这里回答是因为我似乎没有足够的声誉来评论而不是回答。 目前还不清楚请求中缺少什么,但我会继续检查Web日志(或设置某种日志记录)以查看系统实际接收的内容。根据您对问题的描述,请求以某种方式错过了'fleet'参数。但是您没有在请求中发送此类值,您将邮件正文中的所有数据作为序列化JSON字符串发送。 因此,传递给gAjax的数据不正确/完整,或者您的服务器上发生了一些奇怪的事情。 我显然怀疑它是前者,但无论如何你应该尝试在两端进行记录和调试。 首先,我会做这样的事情:
function gAjax(url, params, onSuccess, onError, onException, onComplete) {
params['debug']=Object.toJSON(params);
new Ajax.Request(url,
//....
这会将JSON字符串添加到请求中,以便您可以准确检查发送的内容。
希望这有帮助!