如何使用EF4从WCF数据服务中删除“d”包装器

时间:2011-10-28 15:45:31

标签: .net json c#-4.0 wcf-data-services

我的问题类似于JsonConvert.DeserializeObject and "d" wrapper in WCF,但我不确定如何根据我的情况实施此问题。这是我完整的web.config WCF数据服务:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

<location path="MyWcfDataService.svc">
    <system.web>
      <authorization>
        <allow users="?"/>
      </authorization>
    </system.web>

    <system.serviceModel>
      <behaviors>
        <endpointBehaviors>
          <behavior name="MyWcfDataServiceBehavior">
            <webHttp defaultOutgoingResponseFormat="Json"/>
          </behavior>
        </endpointBehaviors>
      </behaviors>
    </system.serviceModel>
</location>

</configuration>

我的数据服务很简单:

// specifying WebMessageBodyStyle.Bare doesn't seem to have any effect
[WebGet(ResponseFormat = WebMessageFormat.Json, 
    RequestFormat = WebMessageFormat.Json, 
    BodyStyle=WebMessageBodyStyle.Bare)] 
public string GetJsonTest(string x)
{

    var json = new
    {
        hello = "world"
    };

    return new JavaScriptSerializer().Serialize(json);
}

3 个答案:

答案 0 :(得分:3)

为了扩展Darcy的答案,d对象是防止跨站点脚本攻击的必要条件。 http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx

答案 1 :(得分:0)

问题是你在返回值中自己生成json,然后要求WCF将生成的json字符串作为json返回。

您至少有两种可能的选择:

1)不要指定WCF将其响应值格式化为JSON并保持代码不变(您承担在每个方法中生成json的责任)。

2)修改你的方法以返回你想在json中生成的类的实例(wcf承担生成json的责任)。要实现这一点,您需要将类声明移出方法。

答案 2 :(得分:0)

据我所知,删除'd'是不可能的。出于安全原因,它内置于数据服务中。