ASP.NET Web服务与内部服务器错误(500)响应POST和GET请求
WebService的代码很简单:ASP.NET Web服务与内部服务器错误(500)响应POST和GET请求
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public void receiveOrder(string json) {
Context.Response.Write("ok");
}
和jQuery的调用web服务如下:
$.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();
}
});
然而,铬控制台读取挑衅性的红色:
500(内部服务器错误)
问题是ASMX网络服务需要在请求中找到全部输入参数。如果在对服务器的请求中未找到至少一个输入参数,则Web服务将失败并显示状态码500(内部服务器错误)。
原因是您以错误的方式发送数据。 Web方法的输入参数的名称是json
(请参阅void receiveOrder(string json)
)。所以$.ajax
的data
选项应该是形式
data: JSON.stringify({json: webOrder})
如果使用type: "POST"
,而不是你尝试过data: JSON.stringify(webOrder)
。在POST请求主体的情况下将是json=theVlue
而不仅仅是theValue
。
,如果您使用type: "GET"
data
参数的格式应改为
data: {json: JSON.stringify(webOrder)}
的dataType
的值应该是“JSON”。更改后$.ajax
应该工作。
此外,我建议您在url
选项中使用相对路径。我的意思是使用'/GingerWeb.asmx/receiveOrder'
而不是'http://localhost:50730/GingerWeb.asmx/receiveOrder'
。它会为您节省same origin policy错误。
你好奥列格:你的解释很简单,并重点。我有一个类似的问题,你的解释解决了。我提供了代码片段来帮助“搜索者”了解我面临的问题以及上述如何解决问题。总之,我从一个aspx页面发布一个简单的jquery(.ajax)。我创建了一个web服务,从后端(缓存/数据库)获取一些数据,并返回相同的JSON格式。
JS代码:
var parameters = "{'pageName':'" + sPage + "'}"
var request = $.ajax({
type: "POST",
url: "/NotificationWebService.asmx/GetNotification",
data: parameters,
contentType: "application/json; charset=utf-8",
dataType: "json"
});
ASP.NET代码的Web服务的背后
[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服务代码指定什么是在你的ajax请求的数据参数中发送的。我让他们有所不同,并改变它是相同的,花了几个小时后,我终于找到了正确的解决方案,感谢这篇文章。此外,在我的情况下,我只传递一个“名称:值”对,所以我甚至不必使用一些json De-serialization函数来获取值,上面的pageName只给出了值。
你的数据类型不应该是“json”吗? – 2012-01-28 19:38:23
我想通了。对于未来的搜索者,当您调用asmx页面时出现的内置页面显示webservice需要特殊格式的xml文本,并且(在本例中)json作为其中一个元素。 – lowerkey 2012-01-28 20:29:38