ASP.NET Web服务与内部服务器错误(500)响应POST和GET请求

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(内部服务器错误)

+0

你的数据类型不应该是“json”吗? – 2012-01-28 19:38:23

+0

我想通了。对于未来的搜索者,当您调用asmx页面时出现的内置页面显示webservice需要特殊格式的xml文本,并且(在本例中)json作为其中一个元素。 – lowerkey 2012-01-28 20:29:38

问题是ASMX网络服务需要在请求中找到全部输入参数。如果在对服务器的请求中未找到至少一个输入参数,则Web服务将失败并显示状态码500(内部服务器错误)。

原因是您以错误的方式发送数据。 Web方法的输入参数的名称是json(请参阅void receiveOrder(string json))。所以$.ajaxdata选项应该是形式

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只给出了值。