【问题标题】:JSON return data is always null from WebService (C#.NET)来自 WebService (C#.NET) 的 JSON 返回数据始终为空
【发布时间】:2012-12-12 18:08:36
【问题描述】:

我已经逐步检查了我的 WebServices 代码,以验证我实际上是在返回数据,但是当我检查 JSON 端的返回时,它总是显示“null”。

这是 WebService 代码的 sn-p。

更新:为了大大简化事情,我从 Web 服务返回一个简单的 List 而不是自定义对象,并且我还压缩了 AJAX 调用。

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]

        public List<string> GetLocations(string CustomerID)
        {
            List<string> LocationsList = new List<string>();

            string sql = "select customer_site from demand_addresses where customer_identifier=" + CustomerID;
            if (gDB.ExecuteRet(sql, "DB"))
            {

                DataTable dt = gDB.GetResultDataSet(0);
                int i = 0;
                if (dt.Rows.Count > 0)
                {
                    foreach (DataRow rs in dt.Rows)
                    {
                        LocationsList.Add(rs["customer_site"].ToString());
                    }
                }  
                else
                {
                    LocationsList.Add("No Data Found.");
                }

                return LocationsList;
            }
            else
            {

                LocationsList.Add("No Data Found.");
                return LocationsList;

            }

这里是 AJAX 调用(已更新以反映下面 Kami 的 cmets):

          $.ajax({
                              type: "POST",
                              url: "/webservices/services.asmx/GetLocations",
                              data: "{ 'CustomerID': '" + selectedCustomer + "' }",               
                              contentType: "application/json; charset=utf-8",               
                              dataType: "json",               
                              success: function (data) { alert(data.d); },               
                              error: function (status) {alert(status);}
           });

“alert(data.d)”行导致“TypeError: data is null”,如果我将其更改为“alert(data)”,我只会得到一个显示“null”的警告框。

我需要帮助了解为什么 Web 服务正确返回数据,但它没有返回 AJAX/JSON。

【问题讨论】:

  • 那么,使用 firebug 或 fiddler 之类的东西,你能知道服务器的确切响应是什么吗?
  • 尝试 firebug - 页面刷新速度如此之快,我只看到“内部服务器错误”。
  • 您的回复格式为 json(ResponseFormat.Json)。但是您的服务期望 RequestFormat Xml 或 Json 是什么?或者它可能期望 url 中的参数为 GET 方法
  • "页面刷新太快了,我只看到“内部服务器错误。”啊?这是一个ajax调用,你是什么意思页面刷新?
  • 这是动态下拉过程的一部分。用户从下拉列表中选择“客户”,然后触发此代码以按客户获取位置。当我选择客户(观看萤火虫)时,我可以看到控制台消息“内部服务器错误”大约 0.03 秒,然后消失。

标签: c# ajax json


【解决方案1】:

您没有将变量传递给OnSuccess 函数。

此外,我过去曾遇到过需要使用匿名函数来调用子函数的问题。

试试这样的

$.ajax({
    type: "POST",
    url: "/webservices/services.asmx/GetLocations",
    data: "{ 'CustomerID': '" + selectedCustomer + "' }",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function(data, resp) { OnSuccess(data,resp)}, // anon function may be needed
    error: function(data,resp) { OnError(data,resp)}
});

【讨论】:

  • 对,很好。尽管如此,我还是将 AJAX 代码更改为成功: function (data) { successFunc(data); },并设置一个函数,function successFunc(data) { alert(data); } - 这个警报仍然返回 null。如果我更改为 alert(data.d),它会显示“无法读取属性 'd'”。
【解决方案2】:

几天前我正在开发 wcf webservice,同样的事情也发生在我身上。在最后的退货声明中,一切正常。数据在那里,但是当我在另一边看到它时,什么都没有。

问题是自定义对象(在您的情况下为 LOCATION)具有可为空的属性,但未定义为可为空。我这样做了,它开始工作了。我仍然不确定为什么,但你应该尝试一次。

public class Location
    {
        public string? customer_identifier { get; set; }
        public string[]? customer_site { get; set; }
    }

【讨论】:

  • 我现在摆脱了 customer_identifier,b/c 我现在不需要它。我将 customer_site 更改为“public string?[] customer_site { get; set; }”并导致编译错误“类型'string'必须是不可为空的值类型才能将其用作参数'T'泛型类型或方法 'System.Nullable"
  • 阿汉。我现在在互联网上阅读,因为字符串已经可以为空,所以放 ?将通过一个错误。 ..好的,现在我们应该尽量减少问题。正如其他用户建议的那样,尝试使用 fiddler。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-09
  • 2020-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-06
相关资源
最近更新 更多