ASP.NET webservice使用内部服务器错误(500)进行响应以发布和获取请求

时间:2012-01-28 17:54:55

标签: asp.net web-services jquery

网络服务代码很简单:

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

2 个答案:

答案 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

如果您使用theValuetype: "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只给出了值。