【问题标题】:Understanding Json structure generated by an AJAX-enabled WCF Service了解由启用 AJAX 的 WCF 服务生成的 Json 结构
【发布时间】:2011-04-29 22:24:37
【问题描述】:

下午好

在 Visual Studio 2010 中,我可以在我的解决方案中添加一个名为支持 AJAX 的 WCF 服务的新项目。这将添加一个新的 .svc 文件。

后来,我创建了一个仅用于调试目的的方法:

[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class DataAccessService
{
    [WebGet]
    [OperationContract]
    public MyClass DoWork()
    {
        var o = new MyClass
        {
            Id = 1,
            FirstName = "Junior",
            LastName = "Mayhe"
        }; 
        return o;
    }
}

这里调试的时候是生成的Json字符串:

{"d":
    {"__type":"MyClass:#MyProject",
    "Id":1,
    "FirstName":"Junior",
    "LastName":"Mayhe"
    }
}

问题是,这是什么"d"? 是不是某个 Json 字符串的结果类型代码,如果是,还有其他代码吗?

提前致谢

【问题讨论】:

    标签: json .net-3.5 c#-3.0 wcf


    【解决方案1】:

    您的响应只是被一个名为“d”的父对象封装。它是在 ASP.NET 3.5 Web 服务中引入的,作为防止 JSON 劫持的安全增强。

    为您的服务生成的客户端代理将去掉“d”,因此您永远不会真正知道它的存在。但是由于除了 AJAX 请求之外,您的服务不会真正被消耗,因此您必须通过“.d”属性访问您的 JSON 对象。我建议使用 JSON2 来解析响应,因为在撰写本文时并非所有浏览器都支持原生 JSON。

    您可以阅读更多关于安全问题here 的信息。

    【讨论】:

      【解决方案2】:

      它只是“d”,旨在防止某些跨站点脚本攻击。

      例如考虑一种返回敏感数据(例如银行账户余额)的 int 数组的方法。它可以返回为:

      [10000,12300,15000]
      

      或者:

      {"d":[10000,12300,15000]}
      

      问题在于,在第一种情况下,存在(非常高级和晦涩但真实的)攻击,通过在标签中包含对服务的调用并覆盖 JavaScript 数组构造函数,另一个站点可以窃取此数据。如果 JSON 看起来像后一种情况,则攻击是不可能的。

      微软内部曾讨论过将格式扩展到“d”之外,但我认为它从未走到过任何地方。

      【讨论】:

      • 是的,这似乎是某种信封。要以裸格式获取此内容,我必须添加 [BodyStyle = WebMessageBodyStyle.Bare)] 并将 web.config <enableWebScript /> 标签更改为 <webHttp />
      猜你喜欢
      • 1970-01-01
      • 2015-03-22
      • 2016-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多