【问题标题】:Why does web service return data as msg.d为什么 Web 服务将数据返回为 msg.d
【发布时间】:2012-05-03 01:59:39
【问题描述】:

我发现我的 webmethod 将数据返回为

{ "d":
 [
   {"id":"1","itemtxt":"Masters"},
   {"id":"2","itemtxt":"Transactions"},
   {"id":"3","itemtxt":"Misch. Reports"}
 ]
}

如果您注意到,该数组被命名为“d”。这是为什么 ?有什么规定吗?

为了您的信息,我返回了一个对象列表 (List<webitem>)

public class webitem
{
    public webitem(string kid, string kval)
    {
        this.id = kid;
        this.itemtxt = kval;
    }

    public string id { get; set;  }
    public string itemtxt { get; set; }
}

这个“d”是什么意思?对于我从网络方法发送的任何数据,它是否总是相同的?还是会根据我的数据类型/类类型而改变?

编辑

这是网络方法

[WebMethod]
public  List<webitem> GetSubModules(string key)
{
    string s = " order by smid";
    if (key != null)
        s = " where moduleid=" + key + s;
    return Utility.GetDDLVal("Select smid id,smname itemtxt from m_submodules "+s, null, null);
}

【问题讨论】:

  • 我看不到任何return ... 代码
  • 用返回码更新了 webmethod

标签: jquery asp.net json web-services javascriptserializer


【解决方案1】:

作为 ASP.NET 的一部分,这是一个安全功能。只要您不更改序列化程序,它就会一直存在。 David Ward 的博客(现已不复存在)说明了它是什么:

这是所有通过 ASP.NET 3.5 中的 ASP.NET AJAX 扩展序列化的 ASMX 服务 JSON 的情况。即使您只返回一个标量返回值,例如字符串、int 或布尔值,结果也将始终包含在“d”中。

以及为什么:

{"d": 1 }

不是有效的 JavaScript 语句,如:

[1]

是。

因此,“d”参数的换行可防止将字符串作为脚本直接执行。无需担心 Object 或 Array 构造函数。

【讨论】:

  • {"d":1} 在 JS 中完全有效——例如,{"d":console.log("Do Evil")} 在 nodejs 中完美执行,这是您的参考博客正在解释它试图防止的安全问题。因此,包装确实提供任何安全性。
  • Dave Reed's comment 在链接的博客文章中有更多详细信息。
  • 响应很晚,但安全性是关于 json,而不是 JavaScript。上面的例子不起作用。 JSON.parse("{\"d\":console.log(\"Do Evil\")}")。使用数组示例,它可以成功解析并导致执行。
猜你喜欢
  • 1970-01-01
  • 2014-06-09
  • 1970-01-01
  • 1970-01-01
  • 2020-03-23
  • 2011-09-29
  • 2018-12-22
  • 2012-12-21
  • 1970-01-01
相关资源
最近更新 更多