2010-02-02 33 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