网络服务代码很简单:
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public void receiveOrder(string json) {
Context.Response.Write("ok");
}
调用webservice的jquery如下:
$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
url: 'http://localhost:50730/GingerWeb.asmx/receiveOrder',
data: 'test', //JSON.stringify(webOrder),
dataType: "text",
success: function(data){
if(data === "ok")
orderPlaced();
}
});
然而,Chrome控制台读出挑衅性的红色:
500(内部服务器错误)
答案 0 :(得分:1)
问题是ASMX Web服务需要在请求中找到所有输入参数。如果在对服务器的请求中找不到至少一个输入参数,则Web服务失败,状态代码为500(内部服务器错误)。
原因是您以错误的方式发送数据。 Web方法的输入参数的名称为json
(请参阅void receiveOrder(string json)
)。因此data
的{{1}}选项应采用
$.ajax
如果您使用之前尝试过的data: JSON.stringify({json: webOrder})
而不是type: "POST"
。如果POST请求正文中的内容为data: JSON.stringify(webOrder)
而不是json=theVlue
。
如果您使用theValue
,type: "GET"
参数的格式应更改为
data
data: {json: JSON.stringify(webOrder)}
的值应为'json'。更改后,dataType
应该有效。
此外,我建议您在$.ajax
选项中使用相对路径。我的意思是使用url
代替'/GingerWeb.asmx/receiveOrder'
。它可以帮助您避免same origin policy错误。
答案 1 :(得分:0)
Hello Oleg:您的解释很简单,也很重要。我有一个类似的问题,你的解释解决了。我正在提供代码片段,以帮助'搜索者'了解我面临的问题以及上述内容如何帮助解决问题。简而言之,我从aspx页面发出一个简单的jquery(.ajax)。我创建了一个Web服务,从后端(缓存/数据库)获取一些数据,并以json格式返回相同的数据。
JS CODE:
var parameters = "{'pageName':'" + sPage + "'}"
var request = $.ajax({
type: "POST",
url: "/NotificationWebService.asmx/GetNotification",
data: parameters,
contentType: "application/json; charset=utf-8",
dataType: "json"
});
Web服务的ASP.NET代码
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public string GetNotification(string pageName)
{
JavaScriptSerializer js = new JavaScriptSerializer();
Notification ns = NotificationCache.GetActiveNotificationForPage(pageName);
if (ns != null)
{
NotificationJSData nJSData = new NotificationJSData();
nJSData.Code = ns.Code;
nJSData.displayFreq = (short)ns.DisplayFreq;
nJSData.expiryDate = ns.ToDateStr;
return js.Serialize(nJSData);
}
return null;
}
确保您将Web服务代码中指定的'pageName'变量名称与ajax请求的data参数中发送的变量名称相匹配,这是绝对必要的。我让他们与众不同并改变它们是相同的,花了几个小时后,我终于找到了正确的解决方案,感谢这篇文章。另外,在我的情况下,我只传递一个“name:value”对,所以我甚至不必使用一些json反序列化函数来获取值,上面的pageName只给出了值。