【问题标题】:ajax jquery json returns 500 internal server error (undefined) but webmethod worksajax jquery json 返回 500 内部服务器错误(未定义)但 webmethod 有效
【发布时间】:2012-03-16 16:26:39
【问题描述】:

我是 jquery 和 json 的新手,我试图弄清楚为什么 getAreas() 函数返回 500/内部服务器错误 - 未定义。我检查了 WebMethod,它正在返回数据,并且 getRegions() 函数工作得很好。 VS 项目构建得很好。有任何想法吗?代码如下:

C# 服务器端

[WebMethod]
public static ArrayList GetRegionsArrayList()
{
    ArrayList arrayList = new ArrayList();
    foreach (DataRow dr in Utility.Regions().Rows)
    {
        arrayList.Add(new ListItem(dr["Region"].ToString(), dr["Dot4"].ToString()));
    }
    return arrayList;
}

[WebMethod]
public static ArrayList GetAreasArrayList(string Dot4)
{
    ArrayList arrayList = new ArrayList();
    foreach (DataRow dr in Utility.Areas(Dot4).Rows)
    {
        arrayList.Add(new ListItem(dr["Area"].ToString(), dr["Dot6"].ToString()));
    }
    return arrayList;
}

JavaScript

<script type="text/javascript" language="javascript">
    function PopulateControl(list, control) {
        if (list.length > 0) {
            control.removeAttr("disabled");
            control.empty().append('<option selected="selected" value="0">Please select</option>');
            $.each(list, function () {
               control.append($("<option></option>").val(this['Value']).html(this['Text']));
            });
        } else {
            control.empty().append('<option selected="selected" value="0">Not available<option>');
        }
    }

    function getRegions() {
        $.ajax({
            type: "POST",
            url: "Demo.aspx/GetRegionsArrayList",
            data: "{}",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: OnRegionsPopulated,
            error: function (response) {
                alert(response.status + ' ' + response.statusText);
            },
            failure: function (response) {
                alert(response.d);
            }
        });
    }

    function getAreas() {
        $.ajax({
            type: "POST",
            url: "Demo.aspx/GetAreasArrayList",
            data: "{Dot4: ' + $('#<%=DDL_Region.ClientID%>').val() + '}",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: OnAreasPopulated,
            error: function (response) {
                alert(response.status + ' ' + response.statusText);
            },
            failure: function (response) {
                alert(response.d);
            }
        });
    }

    function OnRegionsPopulated(response) {
        PopulateControl(response.d, $("#<%=DDL_Region.ClientID%>"));
    }

    function OnAreasPopulated(response) {
        PopulateControl(response.d, $("#<%=DDL_Area.ClientID%>"));
    }
</script>

控件

<select id="Select1" onchange="getRegions();">
<select id="DDL_Region" onchange="getAreas();" runat="server"></select>
<select id="DDL_Area" runat="server"></select>

错误详情:

{"Message":"无效的 JSON 原语:Dot4。","StackTrace":" at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializePrimitiveObject()\r\n 在 System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 深度)\r\n 在 System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(字符串 输入,Int32 depthLimit,JavaScriptSerializer 序列化程序)\r\n at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer 序列化程序、字符串输入、类型类型、Int32 depthLimit)\r\n at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize[T](字符串 输入)\r\n 在 System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest(HttpContext 上下文,JavaScriptSerializer 序列化程序)\r\n at System.Web.Script.Services.RestHandler.GetRawParams(WebServiceMethodData 方法数据,HttpContext 上下文)\r\n 在 System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext 上下文,WebServiceMethodData methodData)","ExceptionType":"System.ArgumentException"}

【问题讨论】:

  • 500 表示服务器端有问题
  • 服务器错误的详细信息是什么?
  • 我测试了web方法,方法返回数据。基本上,这些是级联下拉列表。调用 getRegions() 的那个工作得很好。 - 它返回未定义。我不知道如何提取更具体的错误消息。
  • 在浏览器开发者工具中查看net request,可以看到响应和报错详情。
  • 只是一个侧面节点(与您描述的错误无关): $.ajax() 没有“失败”回调。 “成功”和“错误”是您要使用的两个。或者,您可以使用“完成”来捕获这两种情况。

标签: javascript jquery json undefined webmethod


【解决方案1】:

这已经晚了,但它可能对一些旅行者有所帮助...我也发现在处理 XML 时可以很好地处理 XML 的 Web 方法可能会在处理为 JSON 时出现“内部服务器错误”。

在我所有的情况下,这都归结为以下之一。

1) 我的班级有问题被序列化。 我使用 [XmlIgnore] 从 XML 序列化中排除的东西在 JSON 中出现问题(如循环引用)。我用 [ScriptIgnore] 属性解决了这个问题。

2) 我在将 JSON 参数构建到 Web 方法中的客户端 javascript 中存在问题。在这种情况下,服务器返回一个“500 内部服务器错误”,我发现它具有误导性并且坦率地说是不正确的。这不是内部服务器错误,而是格式错误的客户端请求。

查看上面的代码,问题可能只是“Dot4”需要用引号引起来(它是一个“无效的 JSON 原语”,正如错误消息所述)。但是,由于错误消息给出“内部服务器错误”,您开始了漫长的旅程,寻找服务器而不是客户端的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-16
    • 2015-12-09
    • 2016-06-19
    • 1970-01-01
    • 2019-11-12
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    相关资源
    最近更新 更多