2010-02-02 31 views
3

为什么这个WCF 3.5方法WCF +的Json =错误系列化

[ServiceContract] 
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
public class Json 
{ 
    [OperationContract] 
    [WebGet(ResponseFormat = WebMessageFormat.Json)] 
    public string Upper(string text) 
    { 
     return text.ToUpper(); 
    } 
} 

回报{"d":"TEXT"}

它应该返回{"TEXT"}

我使用jQuery调用。

$("#upper").click(function() { 
     $.ajax({ 
      type: "GET", 
      url: "/Json.svc/Upper?text="+$("#input1").val(), 
      success: function(data) { 
       $("#input1").val(data.d); 
      } 
     }); 
    }); 

回答

8

这是一个安全功能,已添加到.NET 3.5中的JSON序列化中。这是一个容器对象,所以不要说,比如说,results[0],你只能说results.d[0]。阅读this article了解更多信息。

+0

尼斯布兰登,但我可以删除/禁用此? – Zote 2010-02-03 16:00:15

+0

不是我所知道的。但是,为什么你想禁用这个?如果您禁用它,则存在很大的安全风险。正如文章所说,现在值得付出努力来处理“d”容器对象。 – 2010-02-03 16:18:39

+0

另外,'{'Text'}'不是有效的JSON。在jQuery 1.4.x中,这会造成麻烦,所以.d也很好。 – 2010-02-08 02:09:46

0

您是否尝试过更改[WebGet]属性的BodyStyle属性,以便响应不被打包?

+0

是的,但我得到了这个异常“WebScriptEnablingBehavior”不支持“身体风格”Wrapped“。将主体样式更改为”WrappedRequest“。 或 “WebScriptEnablingBehavior”不支持“Bare”主体样式。将主体样式更改为“WrappedRequest”。 – Zote 2010-02-03 11:20:24

+1

如果您使用的是webScriptEnablingBehavior,那么是的,它可能会导致问题。有没有你想要的而不是webHttpBehavior的特定原因? 另外,你检查了这个:http://www.west-wind.com/weblog/posts/324917.aspx – tomasr 2010-02-03 12:32:17

+0

没有特别的原因。我昨天喜欢你的链接,但我认为我的web.config是错误的,所以我得到了另一个关于bing的教程。这是教程工作正常,唯一的问题是这个d“属性”。 – Zote 2010-02-03 12:56:08

0

我假设你在你的行为配置中使用<enableWebScript/>,用<webHttp defaultOutgoingResponseFormat="Json"/>代替它,你将得到没有根“d”而没有“__type”道具的json。

不过,我只在4.0

测试这个我还没有在代码中使用任何属性。

+0

这不起作用,您仍然必须拥有bodystyle = webmessagebodystyle.wrappedrequest,其中包含“d”和“___type”。如果将其更改为Bare,则会出现WebScriptEnablingBehavior不支持Bare的错误。 – Justin 2011-09-28 19:09:38

+0

我可以向你保证它确实有效,但我应该澄清说我只在4.0中进行了测试,并且我没有在代码中使用任何属性。 – JeremyWeir 2011-09-29 17:28:12