2012-02-15 96 views
0

作爲WCF新手,我試圖找出從WCF服務返回JSON對象的正確配置。WCF響應中的JSON格式

結果我得到的是(在螢火蟲看):

{"TestServiceResult": "{\"AccountID\":999999,\"CardNumber\":555555,\"AccountBalance\":999.99,\"GivenName\":\"Ben\",\"FamilyName\":\"Rosniak\"}"} 

我感興趣的部分是一個長字符串,而不是JSON對象我之後。

<!-- Added for Mobile Pay Service--> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="MobilePayServiceBehaviour" > 
      <serviceDebug includeExceptionDetailInFaults="true"/> 
      <!--<serviceCredentials > 
      <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="MobilePayService.WtfUserNamePasswordValidator, MobilePayService" /> 
      </serviceCredentials> 
      <serviceAuthorization principalPermissionMode="Custom"> 
      <authorizationPolicies> 
       <add policyType="MobilePayService.WtfAuthorizationPolicy, MobilePayService" /> 
      </authorizationPolicies> 
      </serviceAuthorization>--> 
     </behavior> 
     </serviceBehaviors> 
     <endpointBehaviors> 
     <behavior name="WebHttpBehaviour"> 
      <webHttp automaticFormatSelectionEnabled="false" defaultBodyStyle="Wrapped" defaultOutgoingResponseFormat="Json" helpEnabled="true" /> 
     </behavior> 
     </endpointBehaviors> 
    </behaviors> 

,我使用,以確保響應被格式化的測試方法:

[WebGet(UriTemplate = "TestService/{id}/{device}/{culture}")] 
public string TestService(string id, string device, string culture) 
{ 
    WCFProfileModel profileModel = new WCFProfileModel() 
     { 
      AccountID = 999999, 
      AccountBalance = 999.99F, 
      CardNumber = 555555, 
      GivenName = "Ben", 
      FamilyName = "Rosniak" 
     }; 

    return profileModel; 
} 

關於服務的唯一配置(該項目是由別人開始)不知何故,響應被包裝在某種模板中,我想知道這是怎麼發生的,但我不確定從哪裏開始尋找這個。我想除掉那些"TestServiceResult"部分,只回:

{"AccountID":999999,"CardNumber":555555,"AccountBalance":999.99,"GivenName":"Ben","FamilyName":"Rosniak"}

UPDATE: 我試圖教程here(更新我的代碼,以反映這一點)以下的,但我得到一個錯誤「的說法profileModel不能隱式轉換爲字符串「。

回答

3

感謝您的回覆(and this link),雖然都以自己特定的方式有所幫助,但我不得不將BodyStyle = WebMessageBodyStyle.Bare作爲mehod屬性(謝謝@Mehmet Aras)。

返回一個字符串顯然是錯誤的方法,並且必須將返回類型更改爲WCFProfileModel

在WCFProfileModel,我有這樣的:

namespace MyNamspace.PhonePayService.DataModels 
{ 
    [DataContract] 
    public class WCFProfileModel 
    { 
     [DataMember] 
     public int AccountID { get; set; } 

     [DataMember] 
     public int CardNumber { get; set; } 

     [DataMember] 
     public float AccountBalance { get; set; } 

     [DataMember] 
     public string GivenName { get; set; } 

     [DataMember] 
     public string FamilyName { get; set; } 
    } 
} 

這最後的方法是這樣的:

[WebGet(UriTemplate = "TestService/{id}/{device}/{culture}", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)] 
    public WCFProfileModel TestService(string id, string device, string culture) 
    { 
     WCFProfileModel profileModel = new WCFProfileModel() 
      { 
       AccountID = 999999, 
       AccountBalance = 999.99F, 
       CardNumber = 555555, 
       GivenName = "Ben", 
       FamilyName = "Rosniak" 
      }; 

     return profileModel; 
    } 

東西我完全忽略。

+0

M $應該默認它爲Bare,但事實並非如此。如果沒有設置,JSON響應會停止工作。 – Devela 2012-10-12 07:13:46

1

我不知道我完全理解你的問題邁克,但我可以給你與JSON合作的最佳建議是抓住詹姆斯牛頓金的JSON.NET包。對我來說,它已被證明無論如何優於基礎.NET庫的JSON支持和性能。它讓你對如何選擇序列化和反序列化JSON有很大的控制權,完整的LINQ支持所有類型的好東西。給它看看,如果你還沒有檢查出來:http://james.newtonking.com/pages/json-net.aspx

+0

謝謝。我會研究這一點。 – 2012-02-15 20:58:34

2

嘗試更改配置中的defaultBodyStyle從Wrapped到裸。

+0

謝謝,我這樣做了,但我想我離開了我的更新,我會解決這個問題。 – 2012-02-15 20:43:00

+0

我剛纔注意到了。該方法返回一個字符串,但你返回一個WCFProfileModel。除非您重寫ToString方法,否則不能這樣做。爲什麼不只是指定WCFProfileModel作爲返回類型? – 2012-02-15 20:48:30

+0

你是對的。我正在嘗試一些東西,沒有正確複製。還有其他問題(見下文)。 – 2012-02-15 20:58:17